1.Coin Change
LeeCode链接:https://leetcode.com/problems/coin-change/description/
你有不同面额的硬币和总金额。写一个函数来计算你所需要的最少的硬币数。如果这笔钱不能由硬币的任何组合构成,则返回-1。
Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)
Example 2:
coins = [2], amount = 3
return -1.
Note:
你可以假设每种硬币都有无数个
int min(int a, int b)
{
return a <= b ? a : b;
}
int coinChange(vector<int>& coins, int amount)
{
int MAX = 1 << 30;
//dp[x]表示总面值为x所需的最少硬币数
//每一个元素都初始为MAX,如果最后无解则dp[amount]==MAX
vector<int> dp(amount + 1, MAX);
dp[0] = 0; //总金额为0时需要0个硬币
//注意:可以将里外层循坏互换,不影响结果
//求出总金额从1到amount所需的最少硬币数
for (int i = 1; i <= amount; i++)
{
//本轮循环只使用第j种硬币,但是dp[]中保存的信息是使用前j-1种硬币对应金额所需的最少硬币数
for (int j=0; j<coins.size(); j++)
{
if (i>=coins[j])
{
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] == MAX ? -1 : dp[amount];
}
2.Coin Change 2
LeeCode链接:https://leetcode.com/problems/coin-change-2/description/
你有不同面额的硬币和总金额。编写一个函数来计算构成该总金额的组合数。你可以假设你有有无限数量的每种硬币。
Note: 可以有如下假设
0 <= amount <= 5000
1 <= coin <= 5000
硬币的面值少于 500
答案肯定可以被存储在32位整型变量int中
int change(int amount, vector<int>& coins)
{
//dp[x]表示总金额为x时硬币的组合数
vector<int> dp(amount + 1);
dp[0] = 1; //当目标面值为0时认为有1种组合方式
/*注意:不可以将里外层循环互换,否则就出现重复计算,
比如:如果有硬币{1,2},且aoumut = 3,那么使用2,1和1,2应该算为一种情况
*/
//使用前i种硬币凑成指定面值
for (int i=0;i<coins.size();i++)
{
//目标面值,从1到amount
for (int j=1;j<=amount;j++)
{
if (j>=coins[i])
{
dp[j] += dp[j - coins[i]];
}
}
}
return dp[amount];
}