給定陣列arr, arr中所有的值都為正數且不重複。每個值代表一中面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。
舉例子arr=[5,2,3], aim=20
不使用當前貨幣arr[i]的最小張數,dp[i-1][j]
適應一張當前貨幣arr[i]的最小張數,dp[i-1][j-arr[i]] + 1
使用兩張當前貨幣arr[i]的最小張數,dp[i-1][j-2*arr[i]] + 2
如果j-arr[i] < 0,說明發生越界了,arr[i]數值太大,乙個就超過了j的值,所以令dp[i][j]=dp[i-1][j]; 如果不越界,就選arr[i],貨幣數是dp[i][j-arr[i]]+1;
1)第一行的元素表示,只是用arr[0]的貨幣,能找開的錢數,只能找開arr[0]的倍數,其他的都找不開,統一設定為max
2)第一列,是想要找的錢數0,需要多少張貨幣,不需要貨幣,全部設定為0.
dp[i-1][j]表示不使用當前貨幣,找開總錢數j需要多少張
public int mincoins(int arr, int aim])
int n = arr.length;
int max = integer.max_value; //最大值是2^16 -1,因為是從0開始的。最小值是-2^16,大約是21億多
//行的位置表示arr陣列中從0位置到n-1位置,所以不需要加一
int dp = new int[n][aim+1];
for(j=1; j < aim+1; j++)
}int left = 0;
for(int i=1; i < n; i++)
//不選擇i位置arr[i]元素,需要多少張dp[i-1][j]
//比較選擇arr[i]和不選擇arr[i],誰更小
dp[i][j] = math.min(left, dp[i-1][j]);}}
return (dp[n-1][aim] != max) ? dp[n-1][aim] : -1;
}
換錢最少貨幣數
給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,在給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。public class mincoins int len arr.length int max integer.max value...
換錢的最少貨幣數
題目 給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。舉例 arr 5,2,3 aim 20。4張5元可以組成20元,其他的找錢方案都要使用更多張的貨幣,所以返回4。arr 5,2...
換錢的最少貨幣數
題目一 給定陣列arr,arr中所有的值都為正數。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。如 arr 5,2,3 aim 20.最少需要4張 解題思路 經典動態規劃一般分為3部,先求dp i j 矩陣中第一列的值,然後求d...