換零錢 動態規劃解法 C語言描述

2022-07-10 22:15:08 字數 1510 閱讀 6850

已知有三種人民幣,分別為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,橫向表頭取值11,21,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。...