P2347 砝碼稱重 動態規劃遞推,揹包,洛谷

2022-07-03 15:48:18 字數 1459 閱讀 1990

參考題解:點選進入

紀念我第一道沒理解題意的題

''但不包括乙個砝碼也不用的情況'',這句話我看成了每個砝碼起碼放乙個

然後就做不出來了

思路:1.這題資料很小,1000,所以其實沒必要把多重揹包用二進位制優化成01揹包,直接乙個個拆開就好了

2.建立陣列f[2000],用來f[j]=1表示存在重量為j這種可能,f[j]=0則表示不存在這種可能

建立陣列a[2000],用來把多重揹包乙個個拆開

比如說我們輸入的是3 

4 1 0 01

那a就是

陣列f其實是用了"桶"的思想

陣列start存一開始每個砝碼的意義,這個就不用說了

3.對於輸入資料和存入a陣列那一步其實是一塊完成的

int temp_n,t=0

;

for(int i=1;i<=6;i++)

4.邊緣條件的定義  f[a[1]]=1;,這樣i到時候直接從2開始

5.具體的遞推過程

for(int i=2;i<=t;i++)

for(int j=1000;j>=0;j--)

if(f[j])

f[j+a[i]]=1,f[a[i]]=1;

i=2~t表示遍歷全部的砝碼

j=1000~0表示遍歷全部的重量,注意是j--,j是必須要下降的,如果從前面開始,那麼

f[j+a[i]]=1的賦值可能會影響到後面的if(f[j])的判斷

另外乙個層面的理解就是從前往後可能就會出現把乙個砝碼放兩次的情況,違背了我們剛剛拆分的01揹包

6.最後把f陣列掃一遍,每有一次true就ans++,然後ans就是答案

P2347 砝碼稱重

題目入口 p2347 砝碼稱重 寫在前面 本題是乙個簡單的 多重揹包 不用二進位制優化也毫無關係 甚至據說六個迴圈都能過 逃 如何記錄方案數 if dp i i ret 解釋來說就是dp當前重量有 最優 方案說明此重量可實現,那麼結果加一 使用模版 模版 揹包問題彙總 多重揹包模版 二進位制優化 i...

P2347 砝碼稱重

題目描述 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 輸入格式 輸入方式 a1,a2,a3,a4,a5,a6 表示1g砝碼有a1個,2g砝碼有a2個,20g砝碼有a6個 輸出格式 輸出方式 total n n表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用...

P2347 砝碼稱重

題目鏈結 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 輸入方式 a1 a2 a3 a4 a5 a6 表示1g砝碼有a1個,2g砝碼有a2個,20g砝碼有a6個 輸出方式 total n n表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用的情況 1 1 0 ...