poj 3134 IDA*

题意:由x通过乘除运算出x^n,最少需要多少补

分析:看上就是一个搜索,无法准确估计深度,非常适合IDA*这样的算法,固定深度,然后搜索,直接搜索会超时,需要一些强力剪枝,如果到达某一个状态,maxd*(2^(depth-d))<n,这样的状态是无法到达的,因为每一次都是乘,都要小于n,这样的减去,n只有1000,打表发现答案最多是13,所以,再加一个剪枝,如果到12依然没有答案,直接输出13

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,a[15],dep;


bool dfs(int cnt,int maxd){
    if(a[cnt]==n)return true;
    if(cnt>=dep)return false;
    maxd=maxd<a[cnt]?a[cnt]:maxd;
    if(maxd*(1<<(dep-cnt))<n)return false;
    for(int i=0;i<=cnt;i++){
        a[cnt+1]=a[cnt]+a[i];
        if(dfs(cnt+1,maxd))return true;
        a[cnt+1]=a[cnt]-a[i];
        if(a[cnt+1]<0)a[cnt+1]*=-1;
        if(dfs(cnt+1,maxd))return true;
    }
    return false;
}

int main(){
    a[0]=1;
    while(~scanf("%d",&n)&&n){
        int ans=-1;
        if(n==1){puts("0");continue;}
        for(dep=1;dep<=12;dep++)
           if(dfs(0,1)){ans=dep;break;}
        if(ans<0)ans=13;
        printf("%d\n",ans);

    }
    return 0;
}

 

  

 

posted @ 2016-10-04 21:05  N维解析几何  阅读(196)  评论(0编辑  收藏  举报