完全背包问题的具体方案输出
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N][N],d[N][N],res[N]; //d[i][j] = k记录的是当前第i个物品的在每个j的状态下有k个
int main(){
cin >> n >>m;
for(int i = 1; i <= n; i++) cin >>v[i] >>w[i];
for(int i = 1; i <=n; i++){
for(int j = 0; j <=m; j++){
f[i][j] = f[i - 1][j];
for(int k = 0;k *v[i]<=j; k++){
if(f[i][j] < f[i-1][j-v[i]*k]+w[i]*k){
f[i][j] = f[i-1][j-v[i]*k]+w[i]*k;
d[i][j] = k;
}
}
}
}
cout << f[n][m]<<endl;
int tmp = f[n][m];
int i = n, j = m;
while(tmp >0 ){
int k = d[i][j];
if(k != 0){
res[i] = k;
tmp -= k*w[i];
j -= k*v[i];
i--;
}else{
i--;
}
}
for(int i = 1; i <= n; i++){
cout<< res[i]<<" ";
}
return 0;
}举个例子:
输入: 3 7 5 4 3 4 4 5 输出: 9 0 1 1
