代码:
// n=5, c=10, w={2, 2, 6, 5, 4}, v={6, 3, 5, 4, 6}的0-1背包问题的最优解和最优值。
#include <iostream>
using namespace std;
#define N 10
int w[N];//重量
int v[N];//价值
int x[N];//1表放入背包,0表不放入
int n,c;//n:物品个数 c:背包的最大容量
int cw=0;//当前物品总重
int cv=0;//当前物品总价值
int bestp=0;//当前最大价值
int bestx[N];//最优解
//回溯函数 k表示当前处在第几层做选择,k=1时表示决定是否将第一个物品放入背包
void backtrack(int k)
{//叶子节点,输出结果
if(k>n){//找到一个更优的解
if(cv>bestp){//保存更优的值和解
bestp = cv;
for(int i=1; i<=n; i++)
bestx[i] = x[i];
}
}
else{//遍历当前节点的子节点
for(int i=0; i<=1; i++){
x[k]=i;
if(i==0){
backtrack(k+1);
}
else{//约束条件:当前物品是否放的下
if((cw+w[k])<=c){
cw += w[k];
cv += v[k];
backtrack(k+1);
cw -= w[k];
cv -= v[k];
}
}
}
}
}
int main()
{
cout<<"请输入背包的容量:";
cin>>c;
cout<<"请输入物品的个数(注意:不能超过100个!):";
cin>>n;
cout<<"请输入每个物品的重量及价值:"<<endl;
for(int i=1;i<=n;i++)
{
cout<<"请输入第"<<i<<"个物品的重量: ";
cin>>w[i];
cout<<"请输入第"<<i<<"个物品的价值: ";
cin>>v[i];
cout<<endl;
}
backtrack(1);
cout<<bestp<<endl;
cout<<"被选中的物品总价值为 "<<bestp<<endl;
for(int i=1;i<=n;i++)
//cout<<bestx[i]<<" ";
if (bestx[i]==1){
cout<<"第"<<i<<"个物品被选中"<<endl;
}
return 0;
}
运行结果: