砝碼稱重 不同演算法解決

2021-10-23 12:10:40 字數 2040 閱讀 8255

砝碼稱重問題:設有1g、2g、3g、5g、10g、20g的砝碼各若干枚(其質量<=1000g),求出用他們能稱出的質量的種類數(不包括質量為0的情況)。

演算法思路:

1、列舉不同砝碼的個數,計算總重量。並將總重量對應的標誌置為1

2、根據標誌,計算總質量的個數

#include

using

namespace std;

int flag[

1000]=

intmain()

int count=0;

for(

int i=

1;i<=

1000

;i++

)cout

0;

假設輸入2 1 2 1 1 1,就表述 1 1 2 3 3 5 10 20這些砝碼,對於這些砝碼取或者不取就轉換成了0/1問題。

f[i][j] 表示前i件物品中總重量為5的方案是否存在;

狀態轉移方程:

若f[i-1][j] 存在, f[i][j] =1

f[i-1][ j-w[i] ]存在,則f[i][j] =1

初始狀態:f[k][0]=1

終止狀態:f[num][1000](num表示砝碼的總個數

演算法思路:

1、統計砝碼總數,準備砝碼序列

2、初始化動態規劃資料,做動態規劃

3、統計方案總數

#include

using

namespace std;

int f;

for(

int i=

1;i<=

6;i++

)for

(int i=

0;i<=

1000

;i++

) f[i][0

]=1;

for(

int i=

1;i)for

(int j=

1;j<=

1000

;j++)}

int count=0;

for(

int i=

1;i<

1000

;i++)if

(f[num]

[i])

count++;}

cout<<

"total:"

0;

優化
#include

using

namespace std;

int f[

1005]=

;for

(int i=

1;i<=

6;i++)f[

0]=1

;for

(int j=

1000

;j>=

1;j--)}

int count=0;

for(

int i=

1;i<

1000

;i++)if

(f[i]

) count++;}

cout<<

"total:"

0;

多重揹包
#include

using

namespace std;

int f[

1005]=

;for

(int i=

1;i<=

6;i++)f[

0]=1

;for

(inr i=

1;i<=

6;i+)}

}int count=0;

for(

int i=

1;i<

1000

;i++)if

(f[i]

) count++;}

cout<<

"total:"

0;

砝碼稱重 DP

砝碼稱重 問題描述 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 用他們能稱出的重量的種類數。輸入檔案 a1 a2 a3 a4 a5 a6 表示1g砝碼有a1個,2g砝碼有a2個,20g砝碼有a6個,中間有空格 輸出檔案 total n n表示用這些砝碼能稱出的不同重量...

CodeForces 砝碼稱重

1449 砝碼稱重 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 現在有好多種砝碼,他們的重量是 w0,w1,w2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。樣例解釋 可以將重物和3放到乙個托盤中,9和1放到另外乙個托盤中。input 單組測試資料。...

1449 砝碼稱重

1449 砝碼稱重 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 現在有好多種砝碼,他們的重量是 w0 w1,w2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。樣例解釋 可以將重物和3放到乙個托盤中,9和1放到另外乙個托盤中。in...