找零问题(美元硬币)

# 找零钱问题(递归)
def recDC(coinValueList, change, knownResults):
    minCoins = change
    if change in coinValueList:
        knownResults[change] = 1
        return 1
    elif knownResults[change] > 0:
        return knownResults[change]
    else:
        for i in [c for c in coinValueList if c <= change]:
            numCoins = 1 + recDC(coinValueList, change - i,
                                 knownResults)    # 边界条件
            if numCoins < minCoins:
                minCoins = numCoins
                knownResults[change] = minCoins

        return minCoins


# 找零钱问题(动态规划)
def dpMakeChange(coinValueList, change, minCoins, coinUsed):
    for cents in range(change+1):
        coinCount = cents
        newCoin = 1
        for j in [c for c in coinValueList if c <= cents]:
            if minCoins[cents - j] + 1 < coinCount:
                coinCount = minCoins[cents - j] + 1
                newCoin = j
        minCoins[cents] = coinCount
        coinUsed[cents] = newCoin
    return minCoins[change]

def printCoins(coinUsed, change):
    coin = change
    while coin > 0:
        thisCoin = coinUsed[coin]
        print(thisCoin)
        coin -= thisCoin


if __name__ == '__main__':
    cl = [1, 5, 10, 21, 25]
    coinsUsed = [0] * 64
    coinCount = [0] * 64
    result = dpMakeChange(cl, 63, coinsUsed, coinCount)

### 贪心算法实现超市找零问题 #### 解决方案概述 贪心算法在处理找零问题时,每次选择当前情况下最优的选择,即尽可能多地使用最大面值的硬币。这种方法适用于某些货币系统的找零问题,在这些系统中,贪心策略能够保证找到全局最优解。 对于超市找零问题而言,假设存在一组已知面值的硬币集合\[ \{c_1, c_2,...,c_n\} \],其中\( c_i<c_{i+1}\),以及一个待找回金额V。目标是最少数量的硬币组合成该金额V[^1]。 #### Python代码示例 下面是一个简单的Python程序,用于展示如何利用贪心算法解决这个问题: ```python def make_change(denominations, amount): denominations.sort(reverse=True) # 对硬币面额降序排列 num_coins = 0 coin_counts = [] for denomination in denominations: count = amount // denomination # 计算可以使用的此面额的最大数目 if count > 0: coin_counts.append((denomination, count)) num_coins += count amount -= denomination * count if amount == 0: break return num_coins, coin_counts if __name__ == "__main__": coins = [1, 5, 10, 25] # 不同面值的硬币列表 total_amount = int(input("请输入需要找零的数量:")) result_num, result_list = make_change(coins, total_amount) print(f"最少需要 {result_num} 枚硬币") for item in result_list: print(f"{item[1]} 枚 {item[0]} 分") ``` 这段代码首先定义了一个`make_change()`函数接收两个参数——硬币种类数组和总金额。接着按照从大到小顺序遍历所有可能的硬币类型,并尝试用尽可能多的大面值硬币去凑齐剩余的钱数直到完成整个过程[^3]。 需要注意的是,上述方法仅当输入的硬币体系满足一定条件(比如像美元那样)才能确保获得最小数量的结果;而对于其他任意给定的硬币集则不一定适用。因此,在实际应用之前应当先验证所选硬币组是否适合采用这种贪婪策略来解决问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值