又称暴力算法,一种基于穷举思想的算法
- 设计思路:枚举所有可能解,从中筛选最优解或可行解
- 适用场合:规模小、结构简单的问题(如排序、查找、计数)
- 注意事项:算法效率较低,需关注时间与空间消耗
【例题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;
}