蛮力法----考试算法

选择排序

#include <iostream>
/**
 *蛮力法
 *选择排序 
**/ 
using namespace std;
void Swap(int& a,int& b)
{
	int t;
	t=a;
	a=b;
	b=t;
}
//选择排序 
void SelectSort(int*element,int n)
{
	int min;  // 最小值 
	int min_location;//最小值所在的位置 
	for(int i=0;i<n;i++)  //这层循环表示最小值放入的位置 (0,n-1) 
	{
		min=element[i]; // 最小值每次默认为i的位置的数 
		min_location=i; // 位置默认为i 
		for(int j=i+1;j<n;j++) //这层循环是遍历剩余数组的所有值 
		{
			if(element[j]<min) //找到比min小的数就交换他们的值,以及刷新location位置 
			{ 
				min=element[j];
				min_location=j;
			}
		}
		Swap(element[i],element[min_location]); //上层循环执行完之后,min为剩余数组的最小值,location为 最小值的位置,然后交换i和j位置上的值 
	}	
}
void Output(int*element,int length)
{
	for(int i=0;i<length;i++)
	cout<<element[i]<<" ";
}
int main(int argc, char** argv) {
	//测试
	int a[]={1,9,3,5,7,6};
	SelectSort(a,6);
	//输出
	Output(a,6); 
	return 0;
}

冒泡排序

#include <iostream>
/**
 *蛮力法
 *冒泡法排序 
**/ 
using namespace std;
void Swap(int& a,int& b)
{
	int t;
	t=a;
	a=b;
	b=t;
}
void BubbleSort(int* element,int n)
{
	for(int i=0;i<n-1;i++) //表示趟数,每趟走完,保证剩余的数组中最大的都在最右边
	{
		for(int j=0;j<n-i-1;j++) //从i的位置开始,两个两个比较,保证右边大,如果小就交换 
		{
			if(element[j]>element[j+1])
			Swap(element[j],element[j+1]); 
		} 
	}	 
}
void Output(int*element,int length)
{
	for(int i=0;i<length;i++)
	cout<<element[i]<<" ";
}
int main(int argc, char** argv) {
	//测试
	int a[]={1,9,3,5,7,6};
	BubbleSort(a,6);
	//输出
	Output(a,6); 
	return 0;
}

最大值连续子序问题

#include <iostream>
/**
 *蛮力法
 *最大连续子序问题 
**/ 
using namespace std;

void maxSubSum(int* element,int n)
{
	int max=0;
	int sum;
	for(int i=0;i<n;i++) //遍历所有可能的字串 
	{
		sum=0;
		for(int j=i;j<n;j++)
		{	
			sum+=element[j]; //每加一次就为一个字串的和 
			if(sum>max) //判断该字串是否大于max 
			 max=sum;
		}
	}
	cout<<max;
} 

int main(int argc, char** argv) {
	//测试
	int a[]={-2,11,-4,13,-5,-2};
	//输出
	maxSubSum(a,6);
	return 0;
}

背包问题

有 n 个重量分别是 w1,w2…,wn 的物品(物品编号为 1-n)
它们的价值分别为 v1,v2,…,vn
给定一个容量为 W 的背包。设计从这些物品中选取一部分放入该背包的方案。
每个物品要么选中要么不选中【其实每个物品只有 1 件】,
要求选中的物品不仅能够放在背包中,而且具有最大的价值。
并对如下所展示的 5 个物品求出 W=10 时的最佳解。

物品编号重量价值
1 26
2 2 3
3 6 5
4 5 4
5 4 6
#include <iostream>
#include <string>
#include <algorithm> 
/**
 *蛮力法
 *背包问题 
**/ 
using namespace std;

int vmax=0;//选择背包的价值 
int W=10;//背包限定的容量 
int w[]={2,2,6,5,4};//所有物品的重量 
int v[]={6,3,5,4,6};//所有物品的价值 
//获取背包的选择情况并计算出价值和重量 
void isMaxVlues(string str)
{
	int isw=0;
	int isv=0;
	for(int i=0;i<str.length();i++)
	{
		isv+=(str[i]-48)*v[i];
		isw+=(str[i]-48)*w[i];
	}
	if(isw<=W) //重量满足的情况下 
	{
		if(isv>vmax)  //判断是否价值大于当前的Vmax 
		vmax=isv;
	}
}
//通过全排列求得所有选择背包的情况 
void backpack()
{
	string str="11111";//选择5个背包 
	int pos=0;
	while(str!="00000") //条件为一个背包都不选时退出 
	{
		do{
			isMaxVlues(str);
		}while(next_permutation(str.begin(),str.end())); //全排列所有情况 
		str[pos++]=48; //减少一个背包 
	}
} 
int main(int argc, char** argv) {
	//测试
	backpack();
	//输出
	cout<<vmax;
	return 0;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值