P2347 砝碼稱重

2021-10-10 07:48:29 字數 1425 閱讀 9021

題目鏈結

設有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 0 0 0

total=3

多重揹包的問題,1000以內的資料可以用二進位制優化,優化成01揹包的問題,1000以上的要用單調佇列優化了,這題的資料比較小就用二進位制優化了.二進位制優化就是將個數分成很多塊,用的時候取其中的塊就行了

7可以分成1 2 4 .

12可以分為1 2 4 5

這樣裡面的數都可以用二進位制的加法來表示每乙個數了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef long

long

int ll;

const

int maxn=

2e5+5;

const

int inf=

1e8;

ll dp[maxn]

;//dp[i]表示所給的砝碼可以表示i質量

int vv[maxn]

;int ww[maxn]

;int n;

intmain()

;//質量分組

memset

(dp,0,

sizeof

(dp));

for(

int i=

1;i<=

6;i++

)//6個就遍歷6次

if(s)

//如果還有剩餘不能用二進位制來存放,就單獨放入最後乙個陣列

} dp[0]

=1;//dp[0]一定要等於1,當揹包可以容納下,dp[j-vv[i]]中會減成dp[0],dp[0]=1才能讓數量增加.

for(

int i=

1;i)//num為二進位制後的新的質量

}int cnt=0;

for(

int i=

1;i<=sum;i++

)//dp[i]表示所給的砝碼可以表示i質量,所以如果可以到達數量就加一

if(dp[i]

) cnt++

; cout<

<

"total="

<

}

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 砝碼稱重

時間限制1.00s 記憶體限制125.00mb 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 輸入 1 1 1 0 0 0 0 輸出 1 total 3 方法一 sign j a i 1 思想類似於裝箱問題 include using namespace std con...