洛谷 P2347 砝碼稱重

2021-10-10 01:25:13 字數 1607 閱讀 9281

時間限制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表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用...