算法案例之蛮力法

又称暴力算法,一种基于穷举思想的算法

  • 设计思路:枚举所有可能解,从中筛选最优解或可行解
  • 适用场合:规模小、结构简单的问题(如排序、查找、计数)
  • 注意事项:算法效率较低,需关注时间与空间消耗

【例题1】选择排序

将数组{1,2,3,6,8,4,10,7,5,9}按照从小到大的顺序进行排序

cpp 复制代码
#include<iostream>
using namespace std;
void swap(int &a,int &b){		//标准的交换函数
	int temp=a;
	a=b;
	b=temp;
}
int findmin(int a[],int i,int n){
	int minindex=i;		// 记录最小值的索引
	for(int j=i+1;j<n;j++){
		if(a[minindex] > a[j]){		// 找到更小的值
			minindex=j;		// 更新最小值索引
		}
	}
	return minindex;		// 返回最小值的索引
}
int main(){
	int a[]={1,2,3,6,8,4,10,7,5,9};
	int n=sizeof(a)/sizeof(a[0]);		// n=10
	int minindex;
	for(int i=0;i<n;i++){			// 外层循环
		minindex=findmin(a,i,n);		// 在[i..n-1]中找最小
		if(i!=minindex) swap(a[i],a[minindex]);	// 交换
	}
	for(int i=0;i<n;i++){
		cout<<a[i];		// 输出排序结果
	}
	return 0;
}

【例题2】冒泡排序

将数组{1,2,3,6,8,4,10,7,5,9}按照从小到大的顺序进行排序

cpp 复制代码
#include<iostream>
using namespace std;
void swap(int &a,int &b){		//标准的交换函数
    int temp = a;
    a = b;
    b = temp;
}
int main(){
    int a[]={1,2,3,6,8,4,10,7,5,9};
    int n=sizeof(a)/sizeof(a[0]);
    for(int i=0;i<n;i++){		// 外层循环:控制排序轮数
        for(int j=n-1;j>i;j--){			// 内层循环:从后向前比较相邻元素
            if(a[j]<a[j-1]){
                swap(a[j],a[j-1]);		// 如果逆序就交换
            }
        }
    }
    for(int i=0;i<n;i++){
        cout<<a[i];
    }
    return 0;
}

【例题3】最大连续子序列

给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和

例如:

序列(-2,11,-4,13,-5,-2)的最大子序列和为20

序列(-6,2,4,-7,5,3,2,-1,6,-9,10,-2)的最大子序列和为16

cpp 复制代码
#include<iostream>
using namespace std; 
int main(){
	int a[]={-2,11,-4,13,-5,-2};	// 输入数组
	int n=sizeof(a)/sizeof(a[0]);	// 计算数组长度:6
	int sum,max;					// sum: 当前子数组和,max: 最大和
	for(int i=0;i<n;i++){	// 外层循环:子数组起始位置
		for(int j=i;j<n;j++){	// 内层循环:子数组结束位置
			sum+=a[j];	// 累加当前子数组的和 	
			max = max>sum ? max : sum;	// 更新最大值
		}
		sum=0;	// 重置sum,计算下一个起始位置的子数组
	}
	cout<<max;
	return 0; 
} 
cpp 复制代码
#include<iostream>
using namespace std; 
int main(){
	int a[]={-6,2,4,-7,5,3,2,-1,6,-9,10,-2};
	int n=sizeof(a)/sizeof(a[0]);
	int sum,max;
	for(int i=0;i<n;i++){
		sum+=a[i];
		max=max>sum?max:sum;
		sum=sum>0?sum:0;
	}
	cout<<max;
	return 0; 
}

【例题4】求解0/1背包问题

0/1背包问题:

有 n 个物品,每个物品有重量 wᵢ 和价值 vᵢ

背包容量为 W

每个物品要么全拿(1),要么不拿(0)

目标:在不超过背包容量的情况下,最大化总价值

cpp 复制代码
#include<iostream>
using namespace std; 
int ww,vv,maxv,strres; 	// ww:当前重量, vv:当前价值, maxv:最大价值
int W=10,n=6;			// 背包容量和物品数量
int w[6] = {2,2,6,5,4,3},v[6]={6,3,5,4,6,6};// 物品重量数组,物品价值数组
int main(){
	for(int a=0;a<=1;a++){	// 物品0是否选择
		for(int b=0;b<=1;b++){	// 物品1是否选择
			for(int c=0;c<=1;c++){	// 物品2是否选择
				for(int d=0;d<=1;d++){	// 物品3是否选择
					for(int e=0;e<=1;e++){	// 物品4是否选择
						for(int f=0;f<=1;f++){	// 物品5是否选择
							ww=w[0]*a+w[1]*b+w[2]*c+w[3]*d+w[4]*e+w[5]*f;
							vv=v[0]*a+v[1]*b+v[2]*c+v[3]*d+v[4]*e+v[5]*f;
							if(ww<=W && vv>maxv){	// 满足容量约束且价值更大
								maxv = vv;
							}
						}
					}
				}
			}
		}
	}
	cout<<maxv;
	return 0; 
} 
相关推荐
张张努力变强12 分钟前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发12 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
小镇敲码人16 分钟前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn
张登杰踩17 分钟前
MCR ALS 多元曲线分辨算法详解
算法
平安的平安20 分钟前
面向大模型算子开发的高效编程范式PyPTO深度解析
c++·mfc
June`21 分钟前
muduo项目排查错误+测试
linux·c++·github·muduo网络库
C++ 老炮儿的技术栈26 分钟前
VS2015 + Qt 实现图形化Hello World(详细步骤)
c语言·开发语言·c++·windows·qt
YuTaoShao26 分钟前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
Once_day34 分钟前
C++之《Effective C++》读书总结(4)
c语言·c++·effective c++
波波00734 分钟前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc