您的位置:首页 > 编程语言 > Java开发

LeetCode[518]Coin Change 2(Java)

2017-10-08 20:05 585 查看
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

Solution:
先想到backtracking回溯法暴力求解,但是超时了

然后考虑dynamic programming动态规划,使用一维数组来记录,dp[i] = dp[i] + dp[i - coin].

backtracking:Time Limit Exceed

class Solution {
int count = 0;
public int change(int amount, int[] coins) {
helper(amount, coins, 0, 0);
return count;
}
public void helper(int amount, int[] coins, int current, int start){
if(current > amount){
return;
}
if(current == amount){
count++;
return;
}
for(int i = start; i < coins.length; i++){
helper(amount, coins, current + coins[i], i);
}
}
}

Dynamic progarmming:Accepted
class Solution {
public int change(int amount, int[] coins) {
int[] dp = new int[amount + 1];
dp[0] = 1;
for(int coin : coins){
for(int i = coin; i <= amount; i++){
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: