又見01揹包

又見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;
}
發佈了29 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章