题目内容:
背包最大允许装载为C, 有n个物品要放进背包,每个物品的重量为w[1],w[2],...w[n],每个物品的价值为v[1],v[2],...v[n], 请选择物品装进背包,使得价值最大。C为整数。
输入描述
第一行为物体个数n,以及背包容量C; 第二行为n个重量(实数),空格隔开 第三行为n个价值(实数),空格隔开
输出描述
第一行为最大装载的总价值 第二行为每个物品是否装载,1表示装,0表示不装,中间用空格隔开 (测试数据能保证最优解唯一)
输入样例
5 10 2 2 6 5 4 6 3 5 4 6
输出样例
15 1 1 0 0 1
思路: 为了得到最优解,用了二维数组。
#include <iostream>
#include <cstdio>
using namespace std;
int dp[1000][1000];
int w[1000], v[1000];
int a[1000];
int main(){
int m, c;
cin >> m >> c;
for(int i = 1; i <= m; i++)
cin >> w[i];
for(int i = 1; i <= m; i++)
cin >> v[i];
for(int i = 1; i <= m; i++){
for(int j = 0; j <= c; j++){ //背包可以为0
if(i != 1)
dp[i][j] = dp[i - 1][j];
if(j >= w[i])
dp[i][j] = (dp[i][j] > dp[i - 1][j - w[i]] + v[i] ? dp[i][j] : dp[i - 1][j - w[i]] + v[i]);
// cout << dp[i][j] << " ";
}
// cout << endl;
}
cout << dp[m][c] << endl;
int b = c;
for(int i = m; i >= 1; i--){
if(dp[i][b] > dp[i - 1][b]){
a[i] = 1;
b -= w[i];
}
}
for(int i = 1; i <= m; i++)
cout << a[i] << " ";
return 0;
}