動態規劃 砝碼稱重

2021-06-06 10:54:16 字數 1407 閱讀 9643

**:

問題描述:

設有1g,2g,3g,5g,10g,20g的砝碼各若干枚(其總重≤1000g),要求:

輸入:

a1   a2   a3   a4   a5   a6(表示1g砝碼有a1個,2g砝碼有a2個,......20g砝碼有a6個)

輸出:

total=n (n表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用的情況)

輸入樣例:1  1  0   0   0   0

輸出樣例:total=3,表示可以稱出1g,2g,3g三種不同的重量

動態規劃求解:

從砝碼1開始分析,假設前i個砝碼能稱出的不同重量為q[i],那麼q[i]一定是這樣計算出來的:在q[i-1]的基礎上,對q[i-1]個不同的重量,分別新增k個砝碼i,再新增的過程中除去重複情況。

假設:w[n]表示n個不同重量的砝碼(例子中n=6),w[0~n-1]。

c[n]表示n個不同砝碼相應的數量,c[1~n]。

則:q[i] = (q[i-1] + k*w[i])-新增過程中重複的個數。其中0=定義乙個輔助布林型陣列visit[m+1],這裡的m是例子中的1000,表示最大重量不超過m。

visit[j]=1表示,重量為j的情況已經存在,否則表示重量為j的情況還未出現。其中visit[0]作為乙個多餘空間存在,可以作為乙個臨時變數。最後遍歷visit[1~m],統計1的個數就得到不同重量的個數。

通過這個輔助陣列,就可以除去重複情況,實現如下:

[cpp]view plain

copy

1 #include 

2 using

namespace std;  

3 #define n 6  

4 #define m 1000  

5 int w[n]=;  

6 int c[n]=;  

7 int visit[m+1] = ;  

8   

9 int weight_count()  

10   

33                         }  

34                 }  

35                 visit[0] = total;  

36         }  

37         for(i = 1;i<=m;i++)  

38           

44         }  

45         return count;  

46   

47 }  

48 int main()  

49   

動態規劃 砝碼稱重

砝碼稱重問題 設有1g 2g 3g 5g 10g 20g 的砝碼各若干枚 其質量 1000g 求出用他們能稱出的質量的種類數 不包括質量為0的情況 設dp 1000 陣列為標記陣列。當dp 0時,表示質量為i的情況,目前沒有稱出 當dp 1時,表示質量為i的情況已經稱出。本題目中有多個砝碼,我們順序...

動態規劃 砝碼稱重問題

動態規劃 dynamic programming 這個詞乍一聽感覺甚是高大上,初次學習或者使用的時候會感覺難以理解,這是正常的,畢竟凡事都是一回生二回熟。其實它也不難的,大家要明白乙個道理,能寫到課本上給學生學習的東西必然屬於不難的東西,因為太難的東西寫到課本上讀者接受不了,這本書就沒有出版的意義了...

動態規劃 砝碼稱重問題

一 演算法分析 動態規劃 dynamic programming 這個詞乍一聽感覺甚是高大上,初次學習或者使用的時候會感覺難以理解,這是正常的,畢竟凡事都是一回生二回熟。其實它也不難的,大家要明白乙個道理,能寫到課本上給學生學習的東西必然屬於不難的東西,因為太難的東西寫到課本上讀者接受不了,這本書就...