#include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int n;//物品个数 int W;//背包容量 int *V;//物体的体积 int *Value;//物体的价值 int **List;//列表 int *get;//拿了哪些物体 void displayV(){//输出每个物体的体积和价值 int i=-1; for(;++i<n;){ cout<<'V'<<i+1<<" = "<<V[i]<<' '<<"Value = "<<Value[i]<<endl; } } void displayIndexOfV(int i){ cout<<'V'<<i+1<<" = "<<V[i]<<' '<<"Value = "<<Value[i]<<endl; } void displayList(){ int i=-1,j; for(;++i<n;){ for(j=-1;++j<W;){ cout<<List[i][j]<<' '; } cout<<List[i][j]<<endl; } } int main(){ srand((unsigned int)time(0)); ///////////// 1. 初始化变量 /////////////////// cout<<"物品的个数:"; cin>>n; cout<<"背包的容量:"; cin>>W; V=new int[n]; Value=new int[n]; int i,j; List=new int*[n]; get=new int[n]; memset(get,0,n*sizeof(get)); for(i=-1;++i<n;){ List[i]=new int[W+1]; memset(List[i],0,sizeof(int)*(W+1));//整个列表初始化为0 V[i]=rand()%(W-1)+1;//物品体积小于W大于0 Value[i]=rand()%(n-1)+1;//物体价值小于n大于0 }//for displayV(); ///////////// 2. 开始建表 /////////////////// //第一行直接取值 for(i=V[0]-1;++i<=W;){ List[0][i]=Value[0]; } for(i=0;++i<n;){//遍历除第一行外的每一行 //遍历每一列 for(j=-1;++j<V[i];){ List[i][j]=List[i-1][j]; } for(;j<=W;j++){ if(List[i-1][j-V[i]]+Value[i]>List[i-1][j]){ List[i][j]=List[i-1][j-V[i]]+Value[i]; } else{ List[i][j]=List[i-1][j]; } }//for }//for displayList(); cout<<"最优解"<<List[n-1][W]<<endl; //////////// 3 . 找拿出来的物品 ///////// cout<<"拿出来的物品"<<endl; int m=n; for(i=n;--i>=1;){ if(List[i][m]>List[i-1][m]){ get[i]=1; m-=V[i]; } } //遍历到第一行以后,如果数字不为0,就把第一个物品加进去。 if(List[i][m]!=0){ get[i]=1; } /////////// 4 . 输出拿出来的物品 //////// for(i=-1;++i<n;){ if(get[i]){ displayIndexOfV(i); } } return 0; }
背包问题回溯找取出来的物品:
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013580497/article/details/46892157