算法案例之蛮力法

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

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

【例题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 小时前
Day50 >> 98、可达路径 + 广度优先搜索理论基础
算法·深度优先·图论
散峰而望2 小时前
【数据结构】假如数据排排坐:顺序表的秩序世界
java·c语言·开发语言·数据结构·c++·算法·github
海棠AI实验室2 小时前
第十五章 字典与哈希:高效索引与去重
算法·哈希算法
独自破碎E2 小时前
动态规划-打家劫舍I-II
算法·动态规划
尽兴-2 小时前
JVM垃圾收集器与三色标记算法详解
java·jvm·算法·cms·gc·g1·三色标记算法
沐欣工作室_lvyiyi2 小时前
IIR数字带通滤波器(论文+源码)
算法·matlab·毕业设计·数字滤波器
zh_xuan2 小时前
LeeCode 61. 旋转链表
数据结构·c++·算法·leetcode·链表
tobias.b2 小时前
408真题解析-2010-8-数据结构-拓扑排序
数据结构·算法·计算机考研·408真题解析
txinyu的博客3 小时前
C++ 线程库
开发语言·c++