You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1
.
Example 1:
coins = [1, 2, 5]
, amount = 11
return 3
(11 = 5 + 5 + 1)
Example 2:
coins = [2]
, amount = 3
return -1
.
Note:
You may assume that you have an infinite number of each kind of coin.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
答案如下:
package cn.edu.bupt;
public class CoinChange322 {
public static int coinChange(int[]coins, int amount) {
int[] dp=new int[amount+1];
dp[0]=-1;
if(amount!=0)
{
dp[1]=-1;
for(inti=0;i<coins.length;i++){if(coins[i]==1){dp[1]=1;}}//动态递归算法,首先处理初始值,即dp[0],dp[1]
}
else
{return 0;}
for(inti=2;i<=amount;i++)
{
int min=amount+1;
booleanisone=false;
for(intj=0;j<coins.length;j++)
{
if(i-coins[j]==0)
{
isone=true;//验证是否已经存在于给出的硬币中
}
if(i-coins[j]>0)
{
if(min>dp[i-coins[j]]&&dp[i-coins[j]]!=-1)//当子节点可达时进行操作,可达意为dp[]!=-1
min=dp[i-coins[j]];//取出最小的硬币数目
}
}
if(isone){dp[i]=1;}
else
if(min!=amount+1){dp[i]=min+1;}
elsedp[i]=-1;
}
returndp[amount];
}
public static void main(String[] args) {
int[] coins=new int[]{2};
int amount=0;
}
public int coinChange(int[] coins, int amount) {
int[] cnt = new int[amount+1];
Arrays.sort(coins);
Arrays.fill(cnt, -1);
cnt[0]=0;
for(int i=1;i<cnt.length;i++){
int min = amount+1;
for(int j=0;j<coins.length;j++){
if(i<coins[j]) continue;
if(cnt[i-coins[j]] != -1){ // if there is a fewest way to make the index with coins
min = Math.min(min, cnt[i-coins[j]]);
}
}
cnt[i] = (min==amount+1?-1:min+1);
}
return cnt[amount];
}