Python 动态规划(DynamicProgramming)-硬币找零

动态规划(DynamicProgramming)-硬币找零

1、动态规划

a、什么是动态规划

动态规划(简称:DP)是一种将原有问题分解为较为简单地子问题的方式求解复杂问题的种方法

b、适用对象

  • 两点间最短路径
  • 一组数据的最佳拟合点
  • 满足条件的最小对象集合

2、硬币找零-Coding

# -*- coding: utf-8 -*-
# 动态规划
# 贪婪算法

class RecMC:
    """
    实现找零时使用最少的硬币
    """

    def __init__(self, coinValueList):
        # 硬币数额列表
        self.coinValueList = coinValueList

    def recMc(self, change):
        # 默认初始硬币的数量=数值(拥有1毛的硬币)
        minCoins = change
        if change in self.coinValueList:
            # 如果数额刚好=硬币的数额, 仅需一次
            return 1
        else:
            # 找零的硬币数值必须小于找零数值
            # 如果存在可以找零的大额硬币,优先使用大额硬币,1毛硬币兜底
            for i in [c for c in self.coinValueList if c <= change]:
                print(change-i, "|".center(6, " "), i)
                numCoins = 1 + self.recMc(change - i)
                if numCoins < minCoins:
                    minCoins = numCoins
        return minCoins

    def recDc(self, change, knownResults):
        minCoins = change
        if change in self.coinValueList:
            knownResults[change] = 1
            return 1
        elif knownResults[change] > 0:
            return knownResults[change]
        else:
            for i in [c for c in self.coinValueList if c <= change]:
                numCoins = 1 + self.recDc(change - i, knownResults)
                if numCoins < minCoins:
                    minCoins = numCoins
                    knownResults[change] = minCoins
            return minCoins



if __name__ == "__main__":
    recMC = RecMC([1, 5, 10])
    print(recMC.recMc(32))
    print("main".center(32, "="))
    print(recMC.recDc(63, [0]*64))

猜你喜欢

转载自blog.csdn.net/qq_40601372/article/details/107169289