你有一个背包,最多能容纳的体积是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;
}