| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 909 人关注过本帖
标题:[原创]硬币问题的解答
取消只看楼主 加入收藏
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
 问题点数:0 回复次数:2 
[原创]硬币问题的解答

:居然发了2次错误,

用动态规划就可以AC,如果用简单搜索,ACM的题目大部分是要超时的。

建立数组A[N]N=输入值*100+1;为了方便说明,A[0]没用

初始化A[N]使A[1],A[5],A[10],A[25],A[50]。为1,其他为0

然后for(i=2;i<N*100+1;i++)A[i]=A[i]+A[i-1]+A[i-5]+A[i-25]+A[i-50]/*注意这里要在下标合法的情况下,下标不合法就不加*/

最后输出A[N*100]的值就可以了;当然这个算法对空间要求比较高,其实还可以优化,

大家注意A[I]的值最多和它的前50个有关,其实用一个大小为50的循环数组就可以了——大家不妨去想一想

[此贴子已经被作者于2004-11-21 16:17:24编辑过]

搜索更多相关主题的帖子: 硬币 解答 
2004-11-21 16:16
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 

如果你细心,会发现上面的算法并不是正确的,

上面的算法是建立在对I分有N种方法的话,那对I+1分必然存在对应的N种方法——这个没错

错就在于粗心的乌鸦忘记重判了,如果按上面的算法1 5,和5 1将被看成2种不同的方法,

其实只要用集合的容斥原理就可以解决这个问题。

举个比较简单的例子,假如硬币只有1 5两种,那动态转移方程应该改为A[i]=A[i-1]+A[I-5]-A[i-6];

好了,因为时间的关系,上学去了,


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-11-21 16:33
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
对了live你那几题都解决了吗

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-11-22 12:12
快速回复:[原创]硬币问题的解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028331 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved