View Code
#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; }