hdu 1114Piggy Bank 完全揹包

2022-05-02 19:45:12 字數 2441 閱讀 6516

傳送門

[1]:

[2]:

題意:

有乙個小豬存錢罐,裡面有各式各樣的硬幣,每種硬幣有不同的面值和重量。

現測量出存錢罐初始的重量(e)和存滿錢時的重量(f),問在這n種硬幣中,如何選取,使得選取的硬幣的總重量恰好等於(f-e),且總價值最小。

如果可以找到,輸出"the minimum amount of money in the piggy-bank is num".(num : 總和最小的面值)

如果不能通過組合使得硬幣總重量恰好等於(f-e),則輸出"this is impossible."

分析:

乍一看,和「01」揹包很想,所不同的是,在「01」揹包中,第 i 種物品只有兩種選擇,拿或者不拿;

而此題,第 i 種面值的硬幣可不止有拿與不拿這兩種選擇,而是有拿0,1,2,.....,k個,共(k+1)種選擇,其中k滿足 k*w[i] <= (f-e);

這種每種物品都有無限件可用的問題,稱為「完全揹包」問題。

題解:

1.完全揹包轉「01」揹包

思路:將一種物品拆成多件物品。

考慮到第 i 種物品最多選 (f-e) / w[ i ] 件;

於是可以把第 i 種物品轉化為 (f-e) / w[ i ] 

件費用及價值均不變的物品,然後求解這個01揹包問題。

如果開個二維的dp陣列,指定不可行,具體為什麼,請自行思考;

比較好用的方法就是使用滾動陣列優化空間。

更高效的轉化方法是:把第 i 種物品拆成重量為 w[i]×2k、價值為 p[i]×2k 的若干件物品,其中k滿足 w[i]×2k

< (f-e)。

這是二進位制的思想,因為不管最優策略選幾件第 i 種物品,總可以表示成若干個 2k 件物品的和。

這樣把每種硬幣拆成 log2( (f-e) / w[i]) ) 件物品,是乙個很大的改進。

ac**:

1 #include2

using

namespace

std;

3#define ll long long

4#define inf 0x3f3f3f3f

5const

int maxn=500+50;6

7intn;8

inte,f;

9int

p[maxn],w[maxn];

10int dp[10010

];11

12void

solve()

1328}29

if(dp[v]

30 printf("

the minimum amount of money in the piggy-bank is %d.\n

",dp[v]);

31else

32 printf("

this is impossible.\n");

33}34int

main()

3546

return0;

47 }

view code

2.

我們有更優的o(vn)的演算法

定義dp[ i ][ j ] : 前 i 件物品恰好組成重量 j 的最小面值;

第 i 件物品的狀態轉移方程為:

1

for(int j=w[i];j <= v;++j)

2 dp[j]=min(dp[j],dp[j-w[i]]+p[i]);

完全揹包的特點恰是每種物品可選無限件,所以在考慮「加選一件第 i 種物品」這種策略時,

卻正需要乙個可能已選入第 i 種物品的子結果 dp[ i ][ v-w[i] ],所以就可以並且必須採用 j = w[i]..v 的順序迴圈。

以上思路摘抄自[1]%%%%%%%%%%%%%%%

ac**:

1 #include2

using

namespace

std;

3#define ll long long

4#define inf 0x3f3f3f3f

5const

int maxn=500+50;6

7intn;8

inte,f;

9int

p[maxn],w[maxn];

10int dp[10010

];11

12void

solve()

1328

intmain()

2940

return0;

41 }

view code

完全揹包 HDOJ 1114 Piggy Bank

題目傳送門 題目大意是給出乙個錢罐,錢罐中的錢有一定的重量,同時給出一些硬幣,這些硬幣有自己的重量和價值 每種硬幣有無限個 求錢罐中錢的最少價值。狀態f i j 表示前i件物品放入空間為j的揹包所能取得的最大價值。狀態轉移方程 f i j max f i 1 j k c i k w i 0 k c ...

完全揹包 HDU 1114

今天看了看揹包九講的完全揹包。估計是因為只記住了方程,沒理解透的原因。照著寫,還是錯了 錯就錯在初始化的時候,我全部初始化為0了,然後用max 但是得不到答案。可是初始化出0位置以外,其他都為無窮大,取min,過了 額。去問問高手吧我。再研究了下,猛然回頭,發現,是求揹包裝滿的 最小價值 inclu...

HDU 1114 揹包問題

題意就是 給你一定的空間,一定種類的硬幣,每種硬幣可以重複使用多次,讓我們計算消耗這麼多的空間的最小質量 dp i 1 j 表示的就是從前i種硬幣中挑選質量小於j的最小價值 轉移方程 dp i 1 j min dp i j dp i 1 j w i v i 選取第i個 include include...