POJ2248 Addition Chains 迭代加深

不知蓝书的标程在说什么,,,,于是自己想了一下。。。发现自己的代码短的一批。。。


限制搜索深度+枚举时从大往小枚举,以更接近n+bool判重,避免重复搜索

#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
using namespace std;
inline int g() {
    R ret=0; register char ch; while(!isdigit(ch=getchar())); 
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret;
}
int n,dep=1;
int a[110];
bool v[110];
inline bool dfs(int crt) {
    if(crt==dep+1) return a[dep]==n;
    for(R i=crt-1;i>=1;--i) for(R j=i;j>=1;--j) {
        if(a[i]+a[j]>n) continue;
        if(a[i]+a[j]<=a[crt-1]) break;
        if(v[a[i]+a[j]]) continue;
        a[crt]=a[i]+a[j]; if(dfs(crt+1)) return true;
    } return false;
}
signed main() {
    while(n=g(),n!=0) { dep=1;
        memset(a,0,sizeof(a));memset(v,false,sizeof(v)); a[1]=1;
        while(!dfs(2)) ++dep;
        for(R i=1;i<=dep;++i) printf("%d ",a[i]); putchar('\n');
    }
}

2019.04.26

猜你喜欢

转载自www.cnblogs.com/Jackpei/p/10772315.html
今日推荐