主要思路:从物品n开始向背包里面放
利用二维数组build[i][j]来记录每个阶段背包里面可以放置物品的最大价值情况
i–>(1,n) 用来表示物品的标号
j–>(0,C) 用来表示当前背包的容量
1、第一步放物品n
for(j=0;i<=C;j++){
if(j<weight[n])
build[n][j]=0; 物品n不能放入
else (即j>=weight[n]的情况)
build[n][j]=value[n];
}
C++代码:
#include<iostream>
using namespace std;
typedef struct{
int value;
int weight;
}Kind;
void Knapsack(Kind *kinds,int n,int C,int **build){
for(int j=0;j<kinds[n].weight;j++)
build[n][j]=0;
for(int j=kinds[n].weight;j<=C;j++)
build[n][j]=kinds[n].value; //第一步尝试将物品n放入到背包中
for(int i=n-1;i>=1;i--){
for(int j=0;j<kinds[i].weight;j++)
build[i][j]=build[i+1][j];
for(int j=kinds[i].weight;j<=C;j++){
int temp=kinds[i].weight;
build[i][j]=build[i+1][j-temp]+kinds[i].value>build[i+1][j]?build[i+1][j-temp]+kinds[i].value:build[i+1][j]; //在放不不放之间选择
}
}
}
void output(int **build,int C,int n,Kind *kinds){
int *x;
x=new int[n+1];
for(int i=1;i<n;i++){
if(build[i][C]==build[i+1][C])
x[i]=0;
else{
x[i]=1;
C=C-kinds[i].weight;
}
}
if(build[n][C]>0)
x[n]=1;
else
x[n]=0;
for(int i=1;i<=n;i++)
cout<<"article "<<i<<"---"<<x[i]<<endl;
}
int main(){
int n,C,**build;
Kind *kinds;
cin>>C>>n;
kinds=new Kind[n+1];
build=new int *[n+1];
for(int i=0;i<=n;i++)
build[i]=new int[C+1];
for(int i=1;i<=n;i++)
cin>>kinds[i].value>>kinds[i].weight;
Knapsack(kinds,n,C,build);
for(int i=1;i<=n;i++){
for(int j=1;j<=C;j++)
cout<<build[i][j]<<" ";
cout<<endl;
}
output(build,C,n,kinds);
return 0;
}