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];
}
}