美团的一道编程题

有1,10,20,30,50,100元面值的钞票(每种钞票的数量没有限制),
现在输入一个数:n,求有几种组合方式可以使着几种面值的钞票相加为n?(每种钞票可以用多次)
全部评论
static int getCom(int n) { if(n<0) return 0; int coins[]={1,5,10,20,50,100}; int dp[]=new int[n+1]; dp[0]=1; for(int i=0;i<coins.length;i++) { for(int j=coins[i];j<=n;j++) { dp[j] =(dp[j]+dp[j-coins[i]]); } } return dp[n]; }
点赞 回复 分享
发布于 2016-09-11 16:46
没时间想,最后用了6循环暴力求解。。
点赞 回复 分享
发布于 2016-09-12 09:27
动态规划,找零问题。去网上搜一下,全是
点赞 回复 分享
发布于 2016-09-11 21:25
用 Python 写了个代码,对 DP 有少量修改: 初值:  dp[m][m] = 1 for m in 1,10,20,30,50,100 状态:  dp[m][k] = \sum_{i <= m} dp[i][k-m] for k in 1:n if k > m 结果:  N = sum_m dp[m][n] 代码: from sys import stdin N = int(stdin.readline()) C = [1, 10, 20, 30, 50, 100] C.sort() dp = dict([(c,[0]*(N+1)) for c in C]) for k in xrange(1,N+1): for c in C: if k == c: dp[c][c] = 1 elif k > c: dp[c][k] = sum([dp[i][k-c] for i in C if i <= c]) CS = sum([dp[c][N] for c in C]) print CS
点赞 回复 分享
发布于 2016-09-11 20:31
dp[m][n] 是加和为 n 而且最大的钞票是 m 的组合数量。 初值:  dp[m][0] = 1 for m in 1,10,20,30,50,100 状态:  dp[m][k] = \sum_{i <= m} dp[i][k-m] for k in 1:n 结果:  N = sum_m dp[m][n] 这样算出来的是所有递增的排列数量,也就是组合数量。感觉容易超整数范围,看情况用 long long。
点赞 回复 分享
发布于 2016-09-11 19:25
回溯法
点赞 回复 分享
发布于 2016-09-11 18:05
我用递归,结果虽然对但是容易暴栈
点赞 回复 分享
发布于 2016-09-11 17:41
不算是动态规划吧?求组合数目,而不是最少多少张钞票啊……
点赞 回复 分享
发布于 2016-09-11 17:32
leetcode 39
点赞 回复 分享
发布于 2016-09-11 16:50
美团的编程题 是不是 不可以用自己的编译器
点赞 回复 分享
发布于 2016-09-11 16:48
要输出所有组合还是输出组合数就行了?
点赞 回复 分享
发布于 2016-09-11 16:47
很简单的dp题啊
点赞 回复 分享
发布于 2016-09-11 16:42

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
VirtualBool:都去逗他了?
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务