您的位置:首页 > 其它

Leetcode 322 & 518

2017-10-29 15:46 246 查看

Leetcode 322 & 518

322 Leetcode 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)
,还要注意判断放进某枚硬币以后是否会超出金额总额

class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
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);
}
}
}
return ans[amount] > amount ? -1:ans[amount];
}
};


Leetcode 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 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

题解

和上一道题类似,也是背包问题,用动态规划的方法,不同的是数组ans[i]表示的是有多少个组合方式,相应的核心代码就应该是
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: