又見01揹包
時間限制:1000 ms | 內存限制:65535 KB
難度:3
-
描述
-
有n個重量和價值分別爲wi 和 vi 的 物品,從這些物品中選擇總重量不超過 W
的物品,求所有挑選方案中物品價值總和的最大值。
1 <= n <=100
1 <= wi <= 10^7
1 <= vi <= 100
1 <= W <= 10^9
-
輸入
- 多組測試數據。
每組測試數據第一行輸入,n 和 W ,接下來有n行,每行輸入兩個數,代表第i個物品的wi 和 vi。 -
輸出
- 滿足題意的最大價值,每組測試數據佔一行。
-
樣例輸入
-
4 5
2 3
1 2
3 4
2 2
-
樣例輸出
-
7
-
代碼如下
-
# include <stdio.h>
# include <string.h>
int main(void) //讓質量與價值互換,用最大價值求最小質量
{
int m,n,i,j,sum;
int w[102],v[102], p[10003];
while (scanf("%d%d", &n,&m) != EOF)
{
memset(p,'b',sizeof(p));
p[0] = 0;
sum = 0;
for (i = 1; i <= n; i++)
{
scanf("%d%d", &w[i],&v[i]);
sum = sum + v[i];
}
for (i = 1; i <= n; i++)
for (j = sum; j >= v[i];j--)
{
p[j] = p[j] > p[j-v[i]] + w[i] ? p[j-v[i]] + w[i]:p[j]; //和平常的(a>b?a:b)不同,這裏用的是a>b?b:a
}
int max = 0;
for (i = sum; i>= 1; i--)
if (p[i] <= m)
{
max = i;break;
}
printf("%d\n", max);
}
return 0;
}