选择排序
#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 | 2 | 6 |
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;
}