zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    
        }
        return 0;
    }
    

      

  • 相关阅读:
    让Python支持中文注释
    【转】python入门指引
    【转】布同:如何循序渐进学习Python语言
    在nagios中监控windows主机系统地址的状态
    大神
    music
    20·15-01-21
    2015-01-20
    2015-01-19
    2015-01-18
  • 原文地址:https://www.cnblogs.com/jihe/p/5931290.html
Copyright © 2011-2022 走看看