【POJ2248】加法链 idfs

首先,在这道题的搜索框架中,在对每一位进行枚举时,复杂度为\(O(n^2)\),但是可知最优解序列的长度不会太长。
其次,采用 \(bool\) 类型返回值时,是一种存在性搜索,并不一定能够得到最优解。
综合以上两点,需要采取迭代化搜索,每次限制在当前层中找出一个符合条件的答案,如果找到了的话一定是最优解。

代码如下

#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn=110;

int a[maxn],n,dep;

bool dfs(int now){
    if(now==dep+1)return a[dep]==n;

    for(int i=now-1;i>=1;i--)//优化枚举顺序
        for(int j=i;j>=1;j--){
            if(a[i]+a[j]>n)continue;
            if(a[i]+a[j]<=a[now-1])break;
            a[now]=a[i]+a[j];
            if(dfs(now+1))return 1;
        }
    return 0;
}

int main(){
    while(scanf("%d",&n)&&n){
        memset(a,0,sizeof(a));
        a[1]=1;
        for(dep=1;;dep++)if(dfs(2))break;
        for(int i=1;i<=dep;i++)
            printf("%d%c",a[i],i==dep?'\n':' ');
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wzj-xhjbk/p/9846868.html