你有一个背包,最多能容纳的体积是V。
现在有n种物品,每种物品有任意多个,第i种物品的体积为
,价值为
。
(1)求这个背包至多能装多大价值的物品?
(2)若背包恰好装满,求至多能装多大价值的物品?
第一行两个整数n和V,表示物品个数和背包体积。接下来n行,每行两个数和
,表示第i种物品的体积和价值。
输出有两行,第一行输出第一问的答案,第二行输出第二问的答案,如果无解请输出0。
2 6 5 10 3 1
10 2
3 8 3 10 9 1 10 1
20 0
无法恰好装满背包。
6 13 13 189 17 360 19 870 14 184 6 298 16 242
596 189
可以装5号物品2个,达到最大价值298*2=596,若要求恰好装满,只能装1个1号物品,价值为189.
#include <stdio.h> #include <limits.h> int max(int a, int b) { return (a > b ? a : b); } int main() { int n, m; scanf("%d %d", &n, &m); int v[n + 1], w[n + 1], dp[n + 1][m + 1]; v[0] = 0, w[0] = 0; for (int i = 0; i <= m; i++) { dp[0][i] = 0; } for (int i = 1; i <= n; i++) { dp[i][0] = 0; scanf("%d %d", &v[i], &w[i]); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (j<v[i]) { dp[i][j]=dp[i - 1][j]; } else { dp[i][j] = max(dp[i - 1][j],dp[i][j-v[i]]+w[i]); } } } printf("%d\n", dp[n][m]); for (int i = 0; i <= n; i++) { dp[i][0] = 0; } for (int i = 1; i <= m; i++) { dp[0][i] = INT_MIN; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (j<v[i]) { dp[i][j]=dp[i - 1][j]; } else { dp[i][j] = max(dp[i - 1][j],dp[i][j-v[i]]+w[i]); } } } printf("%d", (dp[n][m] > 0 ? dp[n][m] : 0)); return 0; }