python---通过递归和动态规划策略解决找零钱问题
也是常见套路。
# coding = utf-8
def rec_mc(coin_value_list, change, know_results):
min_coins = change
if change in coin_value_list:
know_results[change] = 1
return 1
elif know_results[change] > 0:
return know_results[change]
else:
for i in [c for c in coin_value_list if c <= change]:
num_coins = 1 + rec_mc(coin_value_list, change-i, know_results)
if num_coins < min_coins:
min_coins = num_coins
know_results[change] = min_coins
return min_coins
print("===========递归实现========================")
print(rec_mc([1, 5, 10, 25], 63, [0]*64))
def dp_make_change(coin_value_list, change, min_coins, coins_used):
for cents in range(change+1):
coin_count = cents
new_coin = 1
for j in [c for c in coin_value_list if c <= cents]:
if min_coins[cents-j] + 1 < coin_count:
coin_count = min_coins[cents-j]+1
new_coin = j
min_coins[cents] = coin_count
coins_used[cents] = new_coin
return min_coins[change]
def print_coins(coins_used, change):
coin = change
while coin > 0:
this_coin = coins_used[coin]
print(this_coin)
coin = coin - this_coin
a_mnt = 63
c_list = [1, 5, 10, 21, 25]
c_used = [0] * (a_mnt+1)
c_count = [0] * (a_mnt+1)
print("===========动态规划实现========================")
print('Making change for ', a_mnt, 'requires')
print(dp_make_change(c_list, a_mnt, c_count, c_used), 'coins')
print("They are: ")
print_coins(c_used, a_mnt)
print("The used list is as follows: ")
print(c_used)
输出:
D:\cheng\test\Scripts\python.exe tests.py ===========递归实现======================== 6 ===========动态规划实现======================== Making change for 63 requires 3 coins They are: 21 21 21 The used list is as follows: [1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 21, 1, 1, 1, 25, 1, 1, 1, 1, 5, 10, 1, 1, 1, 10, 1, 1, 1, 1, 5, 10, 21, 1, 1, 10, 21, 1, 1, 1, 25, 1, 10, 1, 1, 5, 10, 1, 1, 1, 10, 1, 10, 21] Process finished with exit code 0
python---通过递归和动态规划策略解决找零钱问题的更多相关文章
- 算法 递归 迭代 动态规划 斐波那契数列 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 五大常见算法策略之——动态规划策略(Dynamic Programming)
Dynamic Programming Dynamic Programming是五大常用算法策略之一,简称DP,译作中文是"动态规划",可就是这个听起来高大上的翻译坑苦了无数人 ...
- 70. Climbing Stairs【leetcode】递归,动态规划,java,算法
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- Python学到什么程度就可以去找工作?掌握这4点足够了!
大家在学习Python的时候,有人会问“Python要学到什么程度才能出去找工作”,对于在Python培训机构学习Python的同学来说这都不是问题,因为按照Python课程大纲来,一般都不会有什么问 ...
- 转:python idle 清屏问题的解决
http://www.cnblogs.com/maybego/p/3234055.html python idle 清屏问题的解决 在学习和使用python的过程中,少不了要与python idle打 ...
- Python的递归
递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...
- 递归与分治策略之循环赛日程表Java实现
递归与分治策略之循环赛日程表 一.问题描述 设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能参赛一 ...
- 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集
你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931 GitHub 上有一个 Awesome - XXX 系列 ...
- 动态规划--找零钱 coin change
来自http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/ 对于整数N,找出N的所有零钱的表示.零钱可以用S={s1,s ...
随机推荐
- 前段基础之CSS
本文参考:https://www.cnblogs.com/ctztake/p/7577436.html CSS 语法 CSS规则由两个主要的部分构成:选择器,以及一条或多条声明. ''' select ...
- Nginx 测试环境配置,留作笔记使用
Nginx 测试环境配置,留做笔记 以下全是配置文件的配置,如果有疑问还请移步Nginx官网参考官方文档. 环境: [root@CentOS6-M01 conf]# cat /etc/redhat-r ...
- vc++基础班[21]---文件的基本操作之CFile
①.文件的创建.打开.关闭: 文件的创建.打开:CFile::Open 文件的关闭:CFile::Close CFile::modeCreate:以新建方式打开,如果文件不存在,则新建:如果文件已 ...
- 题解-Codeforces710F String Set Queries
咕了好久没更博客,最近得知可以去冬眠营玩耍,还可以搭顺风车回广州过年 (最近做到的比较有意思的题目:bzoj3958.hihocoder1419) Problem Codeforces-710F--洛 ...
- 036_lua应用扩展
一.request_id定义 ## # request id ## lua_package_path '/opt/nginx/conf/lua/lib/?.lua'; init_by_lua ' uu ...
- 关于国产手机(含山寨机)的mrp格式文件使用
目前国内的大多数国产手机(山寨机)均支持MRP格式软件,本文将教你如何测试或安装!(MRP格式游戏,是由[杭州斯凯网络科技有限公司]开发的一种轻量级的虚拟平台MINIJ平台格式文件,用标准的ANSI ...
- ansible笔记(6):常用模块之命令类模块
ansible笔记():常用模块之命令类模块 command模块 command模块可以帮助我们在远程主机上执行命令 注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处 ...
- FreeSWITCH voicemail
功能描述:分机不存在时,进行语音留言. 步骤: 1.编译mod_voicemail 模块.默认是已经有编译 2.加载mod_voicemail模块: fs_cli --> reload mo ...
- List<T>常用操作
1.List<T>类型强制转换: List<UIData> datalist=null;datalist.ConvertAll<object>(input => ...
- linux ln 命令使用参数详解(ln -s 软链接)
ln是linux中一个非常重要的命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...