題目鏈結
設有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...