您的位置:首页 > 其它

(M)Dynamic Programming:322. Coin Change

2017-10-09 13:23 190 查看


这道题不难,设一个dp数组,长度是ammount+1,初始化为-1。其中dp[i]表示钱数为i时的最小硬币数的找零,coins[j]为第j个硬币,而i - coins[j]为钱数i减去其中一个硬币的值,剩余的钱数在dp数组中找到值,然后加1和当前dp数组中的值做比较,取较小的那个更新dp数组。

class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, -1);
dp[0] = 0;
for(int i = 1; i <= amount; ++i)
{
for(int j = 0; j < coins.size(); ++j)
{
if(i - coins[j] >= 0 && dp[i - coins[j]] >= 0)
dp[i] = (dp[i] == -1)? dp[i - coins[j]]+1 : min(dp[i], dp[i - coins[j]] + 1); //注意判断dp[i] == -1
}
}
return dp[amount];
}
};另一种写法,不在一开始的时候初始化为-1,而是在最后判断是输出dp[i]还是-1:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int Max = amount + 1;
vector<int> dp(amount + 1, Max);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.size(); j++) {
if (coins[j] <= i) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: