動態規劃 找零錢,最長公共子列

2021-10-05 20:53:12 字數 3032 閱讀 9680

現存人民幣面額 【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 程式設計任務 設計乙個動態規劃演算...