algorithm - 在硬币找零问题中减小数组的大小?
问题描述
硬币找零问题的简单 DP 解决方案使用大小为 SUM 的一维数组,并将其从 0 填充到 SUM。基于重复次数 NUMBER_OF_COINS = min(array[sum-coin1]+1, array[sum-coin2]...)。我写的代码是这样的。
def DynamicChange(money, coins):
if money<=0:
return 0
arr = [0]*(money+1)
for m in range(1, money+1):
arr[m] = 9999999
for coin in coins:
if m>= coin:
if arr[m-coin]+1<arr[m]:
arr[m] = arr[m-coin]+1
return arr[money]
我遇到了一个有趣的问题,即将数组的大小减少到硬币的数量。无法想出相同的解决方案。我们怎样才能将数组的大小减小到硬币的数量并且仍然获得硬币的最小数量?
解决方案
不确定使用深度优先搜索算法是否可以接受,但是当变成非递归实现时,它使用一个与列表大小相同的coins
列表:该列表中的每个值代表一个硬币选择的数量特定面额:
def dfsChange(money, coins):
if money <= 0:
return 0
coins.sort(reverse = True)
arr = [0] * len(coins) # per coin: number selected
coin = 0
count = 0
mincount = 9999999
while True:
arr[coin] = money // coins[coin]
money -= arr[coin] * coins[coin]
count += arr[coin]
if money == 0 and count < mincount:
mincount = count
if count >= mincount or coin == len(coins) - 1:
# back track
count -= arr[coin]
money += arr[coin] * coins[coin]
coin -= 1
while coin >= 0 and arr[coin] == 0:
coin -= 1
if coin < 0:
return mincount
arr[coin] -= 1
count -= 1
money += coins[coin]
coin += 1
推荐阅读
- github - 将 GitHub 存储库重命名为我刚刚删除的名称的安全方法?
- java - SwingUtilities InvokeLater- 什么被认为是不好的做法?
- javascript - 用于启用 Chromevox 扩展的书签
- r - 我无法在 R 中一致地导入股票数据
- javascript - 如何为 django 中的每个帖子更改计时器
- java - java - 如何随机列出位于Java中不同包中的枚举值?
- javascript - 如何获得与 JavaScript 中给出的相同数值?
- spreadsheet - 如何在不使用宏/编码的情况下用 libreoffice calc 中上部非空单元格的值填充空单元格
- python - 我们如何在python中绘制时间散点图
- c++ - 混淆 Begin() 方法作为参数