算法案例之蛮力法

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

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

【例题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; 
} 
相关推荐
仰泳的熊猫2 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码5 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发6 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
Thera7776 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
superior tigre6 小时前
22 括号生成
算法·深度优先
君义_noip7 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
腾阳7 小时前
99%的人忽视了这一点:活着本身就是人生的意义,别让抑郁和内耗成为你的枷锁!
经验分享·程序人生·职场和发展·跳槽·学习方法·媒体
努力也学不会java8 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎8 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针