時間限制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;
const
int n =
1010
;int a[n]
, w=
, num, x, ans;
bool sign[n]
;int main (
) sign[0]
=1;for
(int i =
1; i <= num; i++
)for
(int j =
1010
; j >=
0; j--)if
(sign[j]
) sign[j+a[i]]=
1;for(
int i =
1; i <=
1010
; i++)if
(sign[i]
) ans++
;printf
("total=%d"
, ans)
;return0;
}
方法二:解析 bitset.
bitset<
1001
> s;
簡單的說,是申請了1001的二進位制位空間,初始值全0。
每個二進位制位有它的下標和值0/1,下標表示組合重量,最大組合重量1001,值0/1代表有無該組合重量。
s |
= s << w[i]
;
w[i] 每種砝碼的重量。
對於每乙個砝碼,所有原記錄重量左移該砝碼重量個二進位制位,得到加入該砝碼後可能產生的重量,再與原記錄取並集,就是當前應記錄的砝碼重量啦!
快來試試叭!
s.count() bitset中的庫函式,返回s中1的個數。
#include
using
namespace std;
bitset<
1001
> s;
int w=
;int
main()
cout <<
"total="
<< s.
count()
-1;return0;
}
洛谷P2347 砝碼稱重
設有1g1g1g 2g2g2g 3g3g3g 5g5g5g 10g10g10g 20g20g20g的砝碼各若干枚 其總重 1000 le 1000 1000 輸入格式 輸入方式 a1,a2,a3,a4,a5,a6a 1 a 2 a 3 a 4 a 5 a 6a1 a2 a3 a4 a5 a6 表示1...
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表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用...