換錢的最小貨幣數 java

2021-09-24 04:33:03 字數 1052 閱讀 7809

給定陣列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...