**:
問題描述:
設有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 這個詞乍一聽感覺甚是高大上,初次學習或者使用的時候會感覺難以理解,這是正常的,畢竟凡事都是一回生二回熟。其實它也不難的,大家要明白乙個道理,能寫到課本上給學生學習的東西必然屬於不難的東西,因為太難的東西寫到課本上讀者接受不了,這本書就...