nyoj 860 又見01揹包 01 揹包變形

2021-06-28 08:18:16 字數 1026 閱讀 1300

時間限制:

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 31 2

3 42 2

樣例輸出

7

一開始做這道題真心卡死,後來看別人題解才懂。。。把質量和價值互換就可以解出來,做過這道題後才發現自己的思維真心不給力,看來以後做題要用多種方法ac。

/*01揹包狀態轉移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])  

本題資料太坑,需要的記憶體過大,所以上面的方程是行不通的(親身經歷3次...)。

我們需要換個思路:基本方程裡dp[i][j]記錄的是i個物品裝進重量為j的揹包裡的最大價值,

我們可以讓dp[i][j]記錄i個物品價值和為j時的最小質量,相同價值肯定選擇所需重量最少的。

我們只需要找到在小於或等於總質量的情況下的最大價值j即可

狀態轉移方程:dp[i][j]=min(dp[i-1][j],dp[i-1][j-v[i]]+w[i]) 且有dp[i][j]<=w總重*/

#include#include#include#include#define min(a,b)(a=v[i];j--)

}for(j=sumv;j>=0;j--)}}

return 0;

}

NYOJ 860 又見01揹包

很經典的一道揹包題目,一般情況,我們都是把揹包的容量作為陣列的變數,但是這一道題,揹包容量資料量太大了。10 9 把容量和價值進行互換 include iostream include stdio.h include string include cstring include cmath incl...

nyoj860又見01揹包

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入多組測試資料。每組測試資...

nyoj860 又見01揹包

題源 nyoj860 時間限制 1000 ms 記憶體限制 65535kb 難度 3 描述 有n個重量和價值分 別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入多...