一、题目
1、题目描述
给你一个整数数组
coins
表示不同面额的硬币,另给一个整数amount
表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回
0
。假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
2、接口描述
class Solution {
public:
int change(int amount, vector<int>& coins) {
}
};
3、原题链接
二、解题报告
1、思路分析
求方案数的完全背包
定义状态f[i][j]为前i个物品装满容量为j的背包的方案数
那么f[i][j] = f[i][j] + f[i - 1][j - c[i]]
2、复杂度
时间复杂度:O(nm) 空间复杂度:O(nm)
3、代码详解
cpp
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount + 1);
dp[0] = 1;
for(auto x : coins){
for(int j = x; j <= amount; j++)
dp[j] += dp[j - x];
}
return dp[amount];
}
};
python3
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp = [0] * (amount + 1)
dp[0] = 1
for x in coins:
for j in range(x, amount + 1):
dp[j] += dp[j - x]
return dp[amount]