蛮力算法——0-1背包问题(C++实现)
基本思想:
对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,深度优先遍历,搜索每一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得到的装入总价值,然后记录遍历过的最大价值。
问题描述:
背包问题分为两种,一种是可分割背包,就是我们平常所说的背包问题,可以将物品的一部分放入背包中。另一种就是0-1背包问题。在此问题中的物品只有两种选择,要么全部放入(1),要么不放(0)。接下来使用蛮力算法来实现0-1背包问题。
#include<iostream>
#define N 50
using namespace std;
int n,bestValue,cv,cw,c;//物品数量,最大价值,当前价值,当前重量,背包容量
int x[N],cx[N];//最终存储状态,当前存储状态
struct goods
{
int weight;//物品重量
int value;//物品价值
};
struct goods goods[N];
int knapstack(int i){
if(i>n-1)
{
if(bestValue<cv&&cw<=c)
{
for (int k=0;k<n;k++)
x[k]=cx[k];//存储最优路径
bestValue=cv;
}
return bestValue;
}
cw=cw+goods[i].weight;
cv=cv+goods[i].value;
cx[i]=1;
knapstack(i+1);
cw=cw-goods[i].weight;
cv=cv-goods[i].value;
cx[i]=0;
knapstack(i+1);
return bestValue;
}
int main()
{
cout<<"请输入物品的个数:";
cin>>n;
cout<<"请输入背包的容量:";
cin>>c;
cout<<"请依次输入物品的重量";
for(int i=0;i<n;i++)
{
cin>>goods[i].weight;
}
cout<<"请依次输入物品的价值";
for(int i=0;i<n;i++)
{
cin>>goods[i].value;
}
cout<<"最大价值为:"<<knapstack(0)<<endl;
cout<<"最优装入方案:";
for(int i=0;i<n;i++)
{
cout<<x[i]<<" ";
}
return 0;
}
运行结果
采用蛮力算法实现0-1背包问题,并不是最优的算法。一般并不会使用蛮力算法来实现0-1背包问题。