321
社区成员




有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n<100000),有多少中组合可以组成n分钱?
输出组合数,答案对1e9+7取模。
这个题目需要优化算法,老顾暂时没有优化,先放个会超时的暴力做法,后边再进行优化。在限定了输入值只有则只有70%的通过率。
n = int(input())
if n < 30000:
ans = 0
for i in range(n // 10 + 1):
for j in range((n - i * 10) // 5 + 1):
ans += (n - i * 10 - j * 5) // 2 + 1
print(ans % int(1e9 + 7))
然后找了个 c++ 的题解https://blog.csdn.net/weixin_50953229/article/details/128225185,亲测可以AC,有时间的时候去加强下理解,然后做成 python 和 js 的版本
暂时不懂这是个什么公式推导出来了,就和背包一样,学就完事了
n = int(input())
c = [10,5,2,1]
dp = [1] + [0 for _ in range(n)]
for i in range(len(c)):
for j in range(c[i],n + 1):
dp[j] = dp[j] + dp[j - c[i]]
print(dp[-1] % int(1e9 + 7))