#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;
}
背包问题回溯找取出来的物品: