📅  最后修改于: 2023-12-03 15:23:04.734000             🧑  作者: Mango
本题考查的是动态规划问题,具体要求如下:
给定一组 n 个硬币,它们的面值为 v1,v2,...,vn。(注意,这些硬币不一定是整数)。你可以选择任意数量的硬币,使它们的总价值正好为 S。请输出所有可行的组合数。
该问题可以采用动态规划的思想来解决。定义一个二维数组 dp[i][j] 表示前 i 个硬币能够凑成总价值为 j 的方案数。
对于第 i 个硬币,有两种情况:
综合上述两种情况,得到状态转移方程:
dp[i][j] = dp[i-1][j] + dp[i][j-vi];
边界条件为:
最终的答案即为 dp[n][S]。
下面是该问题的 Python 代码实现:
def count_combinations(coins, S):
n = len(coins)
dp = [[0] * (S+1) for _ in range(n+1)]
# 初始化边界条件
for i in range(n+1):
dp[i][0] = 1
for i in range(1, n+1):
for j in range(1, S+1):
if j >= coins[i-1]:
dp[i][j] = dp[i-1][j] + dp[i][j-coins[i-1]]
else:
dp[i][j] = dp[i-1][j]
return dp[n][S]
动态规划的时间复杂度为 O(nS),空间复杂度为 O(nS)。其中 n 是硬币的数量,S 是总价值。