美团的一道编程题

有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

相关推荐

庸也君:简历粗略看,有可能会被paas,如果详细地看的话,简历写的很优秀,很规范,部分内容也有量化
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务