算法案例之蛮力法

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

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

【例题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 小时前
delete又未完全delete
c++
颜酱4 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub7 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub8 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub8 小时前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP19 小时前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP19 小时前
一文搞懂激活函数!
算法·面试
董董灿是个攻城狮19 小时前
AI 视觉连载7:传统 CV 之高斯滤波实战
算法