給k種面值的硬幣,面值在乙個陣列中num,可用數量無限,求最少幾枚硬幣可以湊出target
如果此時的硬幣數量都是只能用乙個,則dp[i][j]表示0到i的陣列中可以用的元素任意組合出j用的最少硬幣,則dp[i][j]=min(dp[i-1][j],dp[i-1][j-num[j]]+1).但是現在因為硬幣的數量是無限的,所以i這個位置處的元素可以用多次,又因為j是從小遍歷到大的,所以減前面的情況都算過了,只需要算最後一種也就是只用一次num[j]的情況,dp[i][j]=min(dp[i-1][j],dp[i][j-num[j]]+1).
然後初始狀態j=0時全為0,i=0時需要算所有可能由coins[0]得到的錢數.然後算dp[i][j-num[j]]時的技巧是設定乙個left=0.每次進入等於max,然後判斷dp[i][j-num[j]]可否得到,得到則讓left=它,最終dp[i][j]=min(dp[i-1][j],left).
class
solution
}int left=0;
for(
int i=
1;i) dp[i]
[j]=math.
min(dp[i-1]
[j],left);}
}return dp[n-1]
[amount]
==max?-1
:dp[n-1]
[amount];}
}
怎麼狀態壓縮呢,首先得到這個值要的是上一行的值和這一行左邊的值,所以要從左到右來更新這一行的值.
class
solution
}int left=0;
for(
int i=
1;i) dp[j]
=math.
min(dp[j]
,left);}
}return dp[amount]
==max?-1
:dp[amount];}
}
換錢的最少貨幣數
題目 給定陣列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...
換錢的最少貨幣數
換錢的最少貨幣數 給定陣列arr,arr中所有的值都為正整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個 aim,代表要找的錢數,求組成aim的最少貨幣數。輸入描述 輸入包括兩行,第一行兩個整數n 0 n 1000 代表陣列長度和aim 0 aim 5000 第二行n...