現存人民幣面額 【1, 2, 5, 10】,要找零n元,問最少需要多少張人民幣?
n為1,最少需要1張。f(1) = 1
n為2,最少需要1張。f(2) = 1
n為3,最少需要2張。f(3) = 2
n為4,最少需要2張。f(4) = 2
n為5,最少需要1張。f(5) = 1
n為6,最少需要2張。f(6) = 2
n為7,最少需要2張。f(7) = 2
n為8,最少需要3張。f(8) = 3
n為9,最少需要3張。f(9) = 3
思路:當n為2時
1張2元 f(2) = 1 需要1張
當n為3時
1張2元 + 1元最少組合 需要2張: f(2) + f(1) = 2
1張1元 + 2元最少組合 需要2張: f(1) + f(2) = 2
當n為4時
1張2元 + 2元最少組合 需要2張: f(2) + f(3) = 2
1張1元 + 3元最少組合 需要2張: f(1) + f(3) = 3
取最小值2張
當n為5時
1張5元 f(5) = 1 需要1張
當n為9時
1張10元 + ? 不滿足條件: f(10) + ? ------- 不滿足條件
1張5元 + 4元最少組合 需要3張:f(5) + f(4) = 1 + 2 = 3 ------------ 5 + (2 + 2) 4最少2張
1張2元 + 7元最少組合 需要3張:f(2) + f(7) = 1 + 2 = 3 ------------ 2 + (2 + 5) 7最少2張
1張1元 + 8元最少組合 需要4張:f(1) + f(8) = 1 + 3 = 4 ------------ 1 + (1 + 2 + 5) 8最少3張
取最小值3張
public static void main(string args) ;
system.out.println(split(5, table));
}static int split(int total, int table)
if (table[j] == i)
int r = i - table[j]; // 找零9 - 面值5 = 剩餘4
int rnum = 1 + result[r]; // 1(面值5一張) + 剩餘4的最優解數
result[i] = math.min(result[i], rnum);}}
return result[total];
}} 找零n元,總共有多少種方法?
public static void main(string args) ;
system.out.println(total(5, table));
}/**
* for迴圈 k=1 k從1開始 。 結果為列之和
* 0元,1元,2元,3元,4元,5元
* 組合中包含1且都小於等於1 [0, 1, 1, 1, 1, 1]
* 組合中包含2且都小於等於2 [0, 0, 1, 1, 2, 2]
* 組合中包含5且都小於等於5 [0, 0, 0, 0, 0, 1]
* ----------------------------------------
* for迴圈 k=0 k從0開始。 結果為列最後乙個(已求和)。
* 0元,1元,2元,3元,4元,5元
* 組合中面值小於等於1 [0, 1, 1, 1, 1, 1]
* 組合中面值小於等於2 [0, 1, 2, 2, 3, 3]
* 組合中面值小於等於5 [0, 1, 2, 2, 3, 4]
* @param money
* @param table
* @return
*/static int total(int money, int table) else }}
}}
return dp[table.length - 1][money];
}} 最長公共子列
public static void main(string args)
/*** a = "dbabcdfe";
* b = "cabcdc";
* a[2] = b[1] dp[2][1] = 1 = 1
* a[3] = b[2] dp[3][2] = dp[2][1] + 1 = 2
* a[4] = b[3] dp[4][6] = dp[3][2] + 1 = 3
* a[5] = b[4] dp[5][4] = dp[3][2] + 1 = 4
*
* [0, 0, 0, 0, 1, 0]
* [0, 0, 1, 0, 0, 0]
* [0, 1, 0, 0, 0, 0]
* [0, 0, 2, 0, 0, 0]
* [1, 0, 0, 3, 0, 1]
* [0, 0, 0, 0, 4, 0]
* [0, 0, 0, 0, 0, 0]
* [0, 0, 0, 0, 0, 0]
* @param a
* @param b
* @return
*/static string lcs(string a, string b) else }}
}int x = 0;
int len = 0;
for (int i = 0; i < dp.length; i++) }}
return a.substring(x + 1 - len, x + 1);
}}
動態規劃5 找零錢問題
題目 有陣列penny,penny中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim 小於等於1000 代表要找的錢數,求換錢有多少種方法。給定陣列penny及它的大小 小於等於50 同時給定乙個整數aim,請返回有多少種方法可以湊成aim。樣例...
動態規劃 找零錢問題 收藏
view plaincopy to clipboardprint?include using namespace std const int m 1000 const int n 3 int coint n int count m 1 count i 表示湊合數量為i所需最少的錢幣數量,則count...
找零錢問題 動態規劃 python
問題描述 設有n種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t 1 t 2 t i 時,可找出錢數j的最少硬幣個數記為c i,j 若只用這些硬幣面值,找不出錢數j時,記c i,j 程式設計任務 設計乙個動態規劃演算...