Ref[Optimization] Dynamic programming【寻找子问题】

Ref[Optimization] Advanced Dynamic programming【优于recursion】

显然,本篇是关于”动态规划"的部分。


找零钱

一、简单直白策略

要点:”个数“其实代表了“for循环”的层数。但“个数”不定,使用“递归”反而能解决这个问题,减少思路上的负担。

import time 

def recMC(coinValueList, change):
minCoins = change
if change in coinValueList:
return 1
else:
for i in [c for c in coinValueList if c <= change]:
# 遍历每一个变量, 相当于多重循环。有意思的是,循环的深度是不确定的;
numCoins = 1 + recMC(coinValueList, change-i)
# 得到这个遍历分支的最终结果;
if numCoins < minCoins:
minCoins = numCoins
return minCoins start = time.time()
print(recMC([1,5,10,25], 63))
end = time.time()
print(end-start)

耗时:31秒。

二、记忆化策略

要点:增加了”结果缓存“,效率极具增加。

代码中的 knownResults 记录了上图中节点(某个change时)的最优/最小的值,作为了记录。

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)
# 更新minCoins
if numCoins < minCoins:
minCoins = numCoins
knownResults[change] = minCoins return minCoins

def main():
amnt = 2163
print(recDC([1,2,5,10,21,25], amnt, [0]*(amnt+1))) main()

耗时:0.01秒。

三、动态规划策略

  要点:不是从上到下的 (递归) 思维,且容易栈溢出;而是从最小的情况入手,逐渐扩大。

def dpMakeChange(coinValueList, change, minCoins, coinsUsed):
# 首先,考虑所有的 "情况",是从小到大考虑
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
coinsUsed[cents] = newCoin return minCoins[change] def printCoins(coinsUsed, change):
coin = change
while coin > 0:
thisCoin = coinsUsed[coin]
print(thisCoin)
coin = coin - thisCoin @fn_timer
def main():
amnt = 2163
clist = [1,2,5,10,21,25]
coinsUsed = [0]*(amnt+1)
coinsCount = [0]*(amnt+1) # print("Making change for", amnt, "requires")
print(dpMakeChange(clist, amnt, coinsCount, coinsUsed), "coins")
# print("They are:")
# printCoins(coinsUsed,amnt)
# print("The used list is as follows:")
# print(coinsUsed) main()

耗时:0.003秒。

End.

[LeetCode] 由 “找零钱" 所想的更多相关文章

  1. LeetCode之找零钱

    题目:已知不同面值的钞票,求如 何用最少数量的钞票组成某个金额,求可 以使用的最少钞票数量.如果任意数量的已知面值钞票都无法组成该金额, 则返回-1. 示例: Input: coins = [1, 2 ...

  2. PAT-乙级-1037. 在霍格沃茨找零钱(20)

    1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知 ...

  3. 贪心算法-找零钱(C#实现)

    找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下. 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单, ...

  4. PAT 1037 在霍格沃茨找零钱(20)(代码+思路)

    1037 在霍格沃茨找零钱(20)(20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon) ...

  5. PAT 乙级 1037 在霍格沃茨找零钱(20)C++版

    1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知 ...

  6. 【算法笔记】B1037 在霍格沃茨找零钱

    1037 在霍格沃茨找零钱 (20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特( ...

  7. PAT——乙级1022:D进制的A+B &乙级1037:在霍格沃茨找零钱

    1022 D进制的A+B (20 point(s)) 输入两个非负 10 进制整数 A 和 B (≤2​30​​−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依 ...

  8. 动态规划--找零钱 coin change

    来自http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/ 对于整数N,找出N的所有零钱的表示.零钱可以用S={s1,s ...

  9. PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20)

    PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20) http://www.patest.cn/contests/pat-b-practise/1037 ...

随机推荐

  1. git 常规业务场景 使用

    一般每个开发者都会有个自己的分支,有个test分支,合并代码用,两条分支相互备份,就算merge的时候被覆盖,也不用担心 建立自己的分支 // 创建本地分支, git checkout -b dev_ ...

  2. property修饰关键字

    修饰符按作用区分:线程安全相关,内存相关,读写权限相关,set=和get=,是否可为空, class 一.默认值 @property NSArray *dataArray; 默认的是:atomic,s ...

  3. HTML页面仿WORD样式

    公司要求不再浏览器中添加office插件的前提下.展示WORD文档中的内容要求一一对应.经过查询资料以及调整,得出如下相关资料: 1  标题样式: 目录 -- 宋体 小二 加粗 一级标题 -- 微软雅 ...

  4. Docker学习总结(四)--应用部署

    MySQL部署 1) 拉取 mysql 镜像 docker pull centos/mysql:5.7 2) 创建容器 docker run -di --name=mysql -p 33306:330 ...

  5. centos6在安装wdcp以后,导入MySQLdb报错问题

    为了方便linux的使用,会先安装好wdcp对服务器进行管理.在装好wdcp会对一些nginx,mysql等自动安装,但是mysql的安装目录会在/www/wdlinux这个目录下,跟一般的mysql ...

  6. MSIL实用指南-创建对象

    创建对象用Newobj指令,它的操作是创建一个新的对象或值类型,并将对象引用的新实例到计算堆栈上.格式是Newobj <构造函数>实例: ilGenerator.Emit(OpCodes. ...

  7. Mac系统中idea配置git总结

    系统配置git相关文章,网上有很多,这里只总结我所遇到的问题 配置git相关信息命令: vim ~/.gitconfig 然后就可以配置相关信息,git配置文件详解请参考以下网址: https://b ...

  8. ResourceManager基本职能和内部架构

    YARN也采用了Master/Slave结构,其中,Master实现为ResourceManager,负责整个集群资源的管理与调度:Slave实现为NodeManager,负责单个节点的资源管理与任务 ...

  9. yield 实现range()函数

    def range(*args,step= 1): args = list(args) if len(args) == 2: yield args[0] while args[0]<args[1 ...

  10. 2018宁夏邀请赛K题Vertex Covers(高维前缀和 状压 折半

    https://vjudge.net/problem/Gym-102222K 题意:给定N点M边的无向图,每个点有点权.  点覆盖表示某个点集S{}覆盖了所有的边,其贡献是S中点权之积. 现在让你求所 ...