| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3217 人关注过本帖, 1 人收藏
标题:上次发了最优埃及分数问题,很多朋友参与了讨论,今天有空写出了我认为是完 ...
只看楼主 加入收藏
rofor
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:68
专家分:165
注 册:2009-6-12
收藏
得分:2 
“完美”?

I'm rofor.
for(;;;);  :-)
RoFoR [AT] YaHoO [DoT] CN
2009-09-13 09:50
专抓你的错
Rank: 2
等 级:论坛游民
帖 子:113
专家分:22
注 册:2009-5-12
收藏
得分:2 
嗯嗯,厉害厉害

C/C++算法群19472277



第19次算法竞赛http://
2009-09-13 09:54
hwdwow
Rank: 2
等 级:论坛游民
帖 子:119
专家分:98
注 册:2009-3-21
收藏
得分:0 
zhddragon的解释完全正确,我就是这么想的。
2009-09-16 12:32
帅超
Rank: 2
等 级:论坛游民
帖 子:25
专家分:23
注 册:2009-9-12
收藏
得分:2 
看不懂。
2009-09-16 15:33
已屏蔽
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:124
注 册:2009-9-5
收藏
得分:2 
lz的代码终于看懂了。。。6楼的。。。不敢看
2009-09-16 20:58
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
看不懂?那我加点注释好了……

程序代码:
#include <stdio.h>

#define N 1000000
#define FLOOR(a, b) ((a) / (b) + ((a) % (b) != 0))
#define GET_E(a, b) FLOOR(b, a)
#define GET_H(c, d, e) ((a) * (e) / (b))

struct
{
    int c, d, e, g;
} stack[N], *top;
int ans[N], cur[N], clen;

/* 化简分数 a/b 到最简形式 */
void simply(int *a, int *b)
{
    int c = *a, d = *b;
    while (d != 0)
    {
        int t = d;
        d = c % d;
        c = t;
    }
    *a /= c;
    *b /= c;
}

/* 假设剩下的分数为a/b,将a/b所有最短序列小于limit的e入栈 */
void push_child(int a, int b, int g, int limit)
{
    int e, emin, emax;

    emin = GET_E(a, b);
    if (clen != -1 && emin <= cur[clen])
        emin = cur[clen] + 1;
    emax = GET_E(a, (limit - g) * b);

    for (e = emax - 1; e >= emin; --e)
    {
        top->c = a * e - b;
        top->d = e * b;
        if (top->c > 0 && top->d > 0)
        {
            simply(&top->c, &top->d);
            top->e = e;
            top->g = g;
            ++top;
        }
    }
}

/* 迭代加深的A*搜索 */
int idastar(int a, int b)
{
    int limit, i;

    simply(&a, &b);
    ans[0] = -1;
    top = stack;
    limit = GET_H(a, b, GET_E(a, b)) - 1;

    while (ans[0] == -1 && ++limit < N)
    {
        clen = -1;
        push_child(a, b, 0, limit);

        /* 以limit为长度限制,搜索 */
        while (top > stack)
        {
            --top;
            clen = top->g;
            cur[clen] = top->e;

            if (cur[clen] < top->d
                    && (ans[0] == -1 || top->d < ans[clen + 1]))
            {
                for (i = 0; i <= clen; ++i)
                    ans[i] = cur[i];
                ans[clen + 1] = top->d;
            }
            else
                push_child(top->c, top->d, clen + 1, limit);
        }
    }
    return ans[0] != -1 ? limit : 0;
}

int main(void)
{
    int i, a, b, len;

    while (scanf("%d%d", &a, &b) != EOF)
    {
        if ((len = idastar(a, b)) == 0)
        {
            puts("can't find answer");
            continue;
        }
        printf("%d", ans[0]);
        for (i = 1; i < len; ++i)
            printf(" %d", ans[i]);
    }
    return 0;
}


这个版本在正确性和速度上取得了均衡。但是好像已经不是A*了……,A*的精髓在于平等地根据评估函数(g + h)选定活动节点。而IDA*几乎完全放弃了这个思路,虽然也是根据g+h选择节点,但是已经不注重节点的顺序了,所以在极端地改进下,发现IDA*几乎就是IDFS的迭代形式了…………

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-09-17 05:45
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
这题做了三天了,模型建立好了,就是细节等方面一直处理不好,老不出结果,来看看你的思路和实现。

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-03-11 14:26
快速回复:上次发了最优埃及分数问题,很多朋友参与了讨论,今天有空写出了我认为 ...
数据加载中...
 
   



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

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