您的位置:首页 > 其它

Leetcode 322 & 518

2017-11-19 23:13 218 查看

Leetcode 322 & 518

Leetcode 322 Coin Change

Description

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.

题解

题目的意思是,给出一堆硬币和一个总额,求出凑出这个总额需要的硬币数。直接用动态规划的算法,用数组ans[i]表示达到总额i的最少的硬币数。核心为
ans[i] = min(ans[i], ans[i - coins[j]] + 1);
,表示在不取硬币j和取硬币j中选择硬币数最小的那种情况,最后输出结果

class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
// 所有初始化为amount+1,便于最后检查是否有解决方法
vector<int> ans(amount + 1, amount + 1);
ans[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.size(); j++) {
if (coins[j] <= i) {
ans[i] = min(ans[i], ans[i - coins[j]] + 1);
}
}
}
// 如果结果大于amount表明没有正确的解法
return ans[amount] > amount ? -1:ans[amount];
}
};


Leetcode 518 Coin Change 2

Description

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 ass
4000
ume 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


题解

和上一道的不同是,要算出总额为amount的硬币组合方法。也是用动态规划的方法,用数组ans[i]表示要组合出总额为i的方法,然后核心为对每种硬币遍历,然后在这个硬币面值到总额amount的区间中,
ans[j] += ans[j - coin];
,表示每次都加上上次的可能性,最后输出最后的数字即可。代码如下:

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