一、题意
给一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。
请计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
二、解法
解法:
动态规划
dp[0]=1:只有当不选取任何硬币时,金额之和才为 0,因此只有 1种硬币组合。
对于面额为coin 的硬币,当 coin≤i≤amount 时,如果存在一种硬币组合的金额之和等于 i - coin,则在该硬币组合中增加一个面额为 coin 的硬币,即可得到一种金额之和等于i的硬币组合。因此需要遍历coins,对于其中的每一种面额的硬币,更新数组dp 中的每个大于或等于该面额的元素的值。
时间复杂度:
O
(
n
a
m
o
u
n
t
)
O(n amount )
O(namount)
空间复杂度:
O
(
a
m
o
u
n
t
)
O(amount )
O(amount)
三、代码
解法:
int change(int amount, vector<int>& coins) {
int n = coins.size();
vector<int> dp(amount+1,0);
dp[0]=1;
for(int j=0;j<n;j++){
for(int i=coins[j];i<=amount;i++){
dp[i]+=dp[i-coins[j]];
}
}
return dp[amount];
}
四、总结
类似完全背包问题。
五、引用
[1] leetcode:518. Coin Change 2
[2] leetcode:518. Coin Change 2官方解法