#include<iostream>
using namespace std;
int n;
float c;
float bestv=0;
float backknap(float w[],float v[],int bestx[],int x[],float sw,float sv,int t){
int j;
float r; //剩余物品的总价值
if(t>=n){
if(sv>bestv){ //如果解比当前解更优
bestv=sv;
for(j=0;j<n;j++) //记录最优解的路径
bestx[j]=x[j];
}
}
else{
if(sw+w[t]<=c){ //搜索左孩子树
x[t]=1;
sw=sw+w[t];
sv=sv+v[t];
bestv=backknap(w,v,bestx,x,sw,sv,t+1);
sw=sw-w[t];
sv=sv-v[t];
}
r=0;
for(j=t+1;j<n;j++) //剩余物品的总价值
r=r+v[j];
if(sv+r>bestv){ //搜索右孩子树
x[t]=0;
bestv=backknap(w,v,bestx,x,sw,sv,t+1);
}
}
return bestv;
}
int main(){
cout<<"请输入n:";
cin>>n;
float sv=0, // 背包当前的质量
sw=0; // 背包当前的重量
int bestx[100], //最优解的路径
x[100]; //当前解的路径
float w[100], //物品的重量
v[100]; //物品的价值
cout<<"请输入物品的重量和价值:"<<endl;
for(int i=0;i<n;i++)
cin>>w[i]>>v[i];
cout<<"请输入背包能承载的重量:"<<endl;
cin>>c;
bestv=backknap(w,v,bestx,x,sw,sv,0);
cout<<"装进背包的物品是:"<<endl;
for(int j=0;j<n;j++)
if(bestx[j]==1)
cout<<j+1<<" ";
cout<<endl;
cout<<"最大价值是:"<<bestv<<endl;
return 0;
}