已知有三種人民幣,分別為1元、2元、5元。求10元可以有多少種換成上述三種零錢的方法(不限制每種人民幣的數量)。
設有a種面值的人民幣,設總**為b,取a種面值中的一種,設其面值為d,則有:
使用a種面值將總**b換取零錢的方法數量 =可以對照下表理解原理:使用a種面值將總**(b-d)換取零錢的方法數量 + 使用(a-1)種面值將總**b換取零錢的方法的數量(其中沒有面值d的人民幣)
1元1元、2元
1元、2元、5元
1,1,2
1,2,50元0
1111元
1111
2元212
23元31
224元4
1335元
5134
6元614
57元71
468元8
1579元
9158
10元1016
10如果設上表為二維陣列a,橫向表頭取值1
、1,2
,1,2,5
,縱向表頭取值為1~10
。一些具體的等式如下:
a[2][1,2] = a[0][1,2] + a[2][1] = 1 + 1 = 2
a[3][1,2] = a[1][1,2] + a[3][1] = 1 + 1 = 2
a[4][1,2] = a[2][1,2] + a[4][1] = 2 + 1 = 3
a[5][1,2] = a[3][1,2] + a[5][1] = 2 + 1 = 3
a[6][1,2] = a[4][1,2] + a[6][1] = 3 + 1 = 4
a[5][1,2,5] = a[0][1,2,5] + a[5][1,2] = 1 + 3 = 4
a[6][1,2,5] = a[1][1,2,5] + a[6][1,2] = 1 + 4 = 5
a[9][1,2,5] = a[4][1,2,5] + a[9][1,2] = 3 + 5 = 8
a[10][1,2,5] = a[5][1,2,5] + a[10][1,2] = 4 + 6 = 10
如果理解了原理,那麼**很簡單。唯一需要注意的是,我們不需要儲存中間量,因此一維陣列完全可以勝任,秘密在於分層計算,這一步累加最為重要a[j] += a[j - kind[i]];
#include int count_change(int n)
; a[0] = 1;
for (int j = 1; j <= n; j++)
a[j] = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j <= n; j++)
printf("\n\n");
} return a[n];
}int main(void)
動態規劃題目(一) 換零錢
動態規劃題目 一 換零錢 想兌換100元錢,有1,2,5,10四種錢,問總共有多少兌換方法。下面提供兩種實現方式,其中 注釋的很清楚。關於動態規劃的基本原理,參考 動態規劃 includeusing namespace std const int n 100 int dimes int arr n ...
換零錢問題(詳解) 動態規劃
經典找零錢問題。領給你乙個陣列arr,和乙個整數aim.如果可以任意選擇arr中的陣列,能不能累加得到aim.返回true或者false。左神版。package 演算法初級 import tool.myarraystool title 換零錢問題 description 給你乙個陣列arr,和乙個整...
動態規劃零錢問題
問題 給你 k 種面值的硬幣,面值分別為 c1,c2 ck,每種硬幣的數量無限,再給乙個總金額 amount,問你最少需要幾枚硬幣湊出這個金額,如果不可能湊出,演算法返回 1 比如說 k 3,面值分別為 2,5,10,總金額 amount 11。那麼最少需要 4枚硬幣湊出,即 11 5 2 2 2。...