题目内容:
背包最大允许装载为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; }