1.暴力解法
//0-1背包问题
#include<iostream>
using namespace std;
#define N 100
int n,maxvalue,cv,cw,C;
int x[N],cx[N];//储存状态
struct goods{
int weight;
int value;
}g[N];
int Put(int i)
{
if(i>n-1)//遍历至叶节点
{
cout<<"结束一轮"<<endl;
cout<<endl;
if(maxvalue<cv&&cw+g[i].weight<=C)
{
maxvalue=cv;
for(int j=0;j<n;j++)
x[j]=cx[j];//储存最优路径
}
return maxvalue;
}
cv+=g[i].value;
cw+=g[i].weight;
cout<<"装入"<<i<<endl;
cx[i]=1;//装入背包
Put(i+1);
cv-=g[i].value;
cw-=g[i].weight;
cout<<"不装入"<<i<<endl;
cx[i]=0;//不装入背包
Put(i+1);
return maxvalue;
}
int main(){
cin>>n>>C;//输入物品的数量,背包的容量
for(int i=0;i<n;i++)
cin>>g[i].weight>>g[i].value;//输入每种物品的重量和价值
int totalvalue=Put(0);//进入深度遍历
for(int i=0;i<n;i++)
cout<<x[i]<<" ";//输出每个物品的放置情况
cout<<endl<<totalvalue<<endl;//输出总价值
return 0;
}
2.动态规划
利用递推公式解决
//动态规划解决0-1背包问题 参考:https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html
#include<iostream>
#include<algorithm>
using namespace std;
int x[10000][10000],tv[10000];//x记录路径,tv记录总价值
struct goods{
int value;
int weight;
}g[10000];
//递推公式:tv(i,C)=max(tv(i−1,C),v(i)+tv(i−1,C−w(i)))
void KnapSack(int n,int c)
{
for(int i=1;i<=n;i++)
for(int j=c;j>0;j--)
{
if(j>=g[i].weight&&tv[j]<=tv[j-g[i].weight]+g[i].value)
{
for(int k=1;k<i;k++)//更新当前的物品放入情况
x[j][k]=x[j-g[i].weight][k];//当前背包中的物品应与tv[j-g[i].weight]中的相同
x[j][i]=1;//将i放入背包
tv[j]=tv[j-g[i].weight]+g[i].value;//因为tv本质上只与j有关,故转换为一维形式
}
else x[j][i]=0;
}
}
int main()
{
int N,C;
cin>>N>>C;
for(int i=1;i<=N;i++)
cin>>g[i].weight>>g[i].value;
KnapSack(N,C);
cout<<tv[C]<<endl;
for(int i=1;i<=N;i++)
if(x[C][i]==1)
cout<<i<<" ";
return 0;
}