leetcode 518. Coin Change 2
阿新 • • 發佈:2019-02-17
You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that you have infinite number of each kind of coin.
Note: You can assume that
- 0 <= amount <= 5000
- 1 <= coin <= 5000
- the number of coins is less than 500
- the answer is guaranteed to fit into signed 32-bit integer
Example 1:
Input: amount = 5, coins = [1, 2, 5] Output: 4 Explanation: there are four ways to make up the amount: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1
Example 2:
Input: amount = 3, coins = [2] Output: 0 Explanation: the amount of 3 cannot be made up just with coins of 2.
Example 3:
Input: amount = 10, coins = [10] Output: 1
法一超時
public class Solution { public int change(int amount, int[] coins) { Arrays.sort(coins); if(coins.length==0){ if(amount==0){ return 1; } return 0; } int temp=coins[coins.length-1]; help(amount,coins,temp); return count; } int count=0; private void help(int amount, int[] coins,int mark){ if(amount==0){ count++; return; }else if(amount<0){ return; } for(int i=0;i<coins.length;i++){ if(mark>=coins[i]){ int temp=coins[i]; int tempamount=amount-temp; help( tempamount, coins, temp); } } } }
方法二採用了動態規劃。。想了半天,沒想出來。。看得別人的狀態轉移方程
public class Solution {
public int change(int amount, int[] coins) {
int[] table=new int[amount+1];
table[0]=1;
for(int i=0;i<coins.length;i++){
int temp=coins[i];
for(int j=0;j<amount+1;j++){
if(j-coins[i]>=0){
table[j]+=table[j-coins[i]];
}
}
}
return table[amount];
}
}