| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 521 人关注过本帖, 1 人收藏
标题:关于动态规划的一点探讨
只看楼主 加入收藏
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
结帖率:95.65%
收藏(1)
已结贴  问题点数:16 回复次数:5 
关于动态规划的一点探讨
最近刚入手动态规划,发现作者貌似有点错误,分享出来,也不知道是我错,还是作者错,高手请鉴定之。
题目是:
给出n个硬币,计算出组成值为S的最多硬币个数和最少硬币个数。

作者用了3种方法,就不一一说了,只说这个所谓的记忆化搜索。

定义d(i),组成面值为i所需要最少或最多枚硬币,也就是求最短和最长路问题。状态转义当然是d(i) = max(d(i - V[j]) + `1);
以下是作者代码
程序代码:
int dpmax(int s){
    if(vis[s]) 
        return d[s];
    vis[s] = 1;
    d[s] = -1 << 30;
    for(int i = 1; i <= n; i++){
        if(s >= V[i])
            d[s] >?= dpmax(s - V[i]) + 1;
    }
    return d[s];
}

读完后,就觉得好像哪里不太对劲,就是那一行d[s] = -1 << 30最后要是没找到,也就是没有发生状态转移,岂不是就返回-1 << 30。
要知道,这样子构造起来的d【s】的值一定错了啊。是不是?
我是这样想的,作者貌似忘记考虑,当到状态边界时,也就是目标状态d【0】时,返回的应该是0.

于是我修改为
程序代码:
int dpmax(int s){
    if(s == 0)
         return 0;
    if(vis[s]) 
        return d[s];
    vis[s] = 1;//记住 
    d[s] = -1 << 30;
    for(int i = 1; i <= n; i++){
        if(s >= V[i])
            d[s] >?= dpmax(s - V[i]) + 1;
    }
    return d[s];
}

我的代码运行后输出 10 2,观察下的确没错,但是作者的代码是输出不了正确结果。
测试数据:
10 10
4 3 2 6 8 1 2 3 11 13
输出:
10 2
搜索更多相关主题的帖子: 动态 return 
2013-04-11 16:40
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:1 
楼主强大

人生是一场错过 愿你别蹉跎
2013-04-11 17:03
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
回复 2楼 fanpengpeng
过奖了。

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-11 23:34
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:14 
dp[0]=0属于边界条件,所以在调用记忆化搜索之前就需要写明vis[0]=1,dp[0]=0,所以作者的这段记忆化搜索代码无误,但是可能他没注明边界条件
2013-04-12 12:10
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:1 
求知就是一条不断发现错误的道路...
哎呀~ 好文雅  好煽情~

三十年河东,三十年河西,莫欺少年穷!
2013-04-12 13:23
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
回复 4楼 czz5242199
嗯嗯嗯,是啊,这样也可以,都差不多~,看来我们都没错。这样写更好

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-12 13:29
快速回复:关于动态规划的一点探讨
数据加载中...
 
   



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

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