硬币划分:牛客代码提交链接
将n用[1, 5, 10, 25]表示,求方式个数。对1000000007取余
class Coins:
def countWays(self, n):
coins = [1, 5, 10, 25]
MOD = 1000000007
d = [0 for i in range(n+1)]
d[0] = 1
for j in range(len(coins)):
for i in range(coins[j], n+1):
d[i] = (d[i] + d[i-coins[j]]) % MOD
return d[n]
兑换零钱最少的次数:leetcode代码提交
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
coins.sort()
d = [amount + 1 for i in range(amount+1)]
d[0] = 0
for i in range(1, amount+1):
for j in range(len(coins)):# 零钱在下,因为保证每个 i 钱的结果状态是已知的
if(i >= coins[j]):
d[i] = min(d[i], 1 + d[i - coins[j]])
if(d[amount] == amount + 1):
return -1
return d[amount]
以上两个题目重要的区别在于for循环的先后。
第一个是累加次数,不能重复;
第二个是比较最小值,自下而上。