pku2248 Addition Chains

传说中的迭代加深算法(ID),第一次认识,其威力真强。融合了普通dfs和普通bfs的优点,于是就可以做出最短加法链

此外还有IDA*算法,有待学习啊。。。

 

#include <stdio.h>

 

#define N 101

 

int n,deep,lim,num[N]= {1};
bool ok;

 

void dfs(int cur,int d)
{
    if(d > deep) return;
    if(num[ cur ] == n)
    {
        lim=cur;
        ok=true;
        return;
    }
    for(int i=cur; i>=0; i--)
    {
        if(num[ cur ] + num[ i ] <= n)
        {
            num[ cur+1 ]=num[ cur ]+num[ i ];
            dfs(cur + 1, d+1);
            if( ok ) return;
        }
    }
}

int main()
{
    while(scanf("%d",&n),n)
    {
        ok=false;
        for(deep=1; 1; deep++)
        {
            dfs(0,1);
            if(ok) break;
        }
        printf("1");
        for(int i=1; i<=lim ; i++)
            printf(" %d",num[i]);
        printf("\n");
    }
    return 0;
}

 

posted @ 2010-08-18 14:26  菜到不得鸟  阅读(147)  评论(0)    收藏  举报