poj 3134 Power Calculus(IDA*)

  题目大意:

用最小的步数算出  x^n   


思路:

直接枚举有限步数可以出现的所有情况。

然后加一个A*   就是如果这个数一直平方  所需要的步骤数都不能达到最优   就剪掉


 

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;

int n;
int save[1005]={1};
int h(int val)
{
    if(val==0)return 0x3f3f3f3f;

    int cnt=0;
    while(val<n)
    {
        val*=2;
        cnt++;
    }
    return cnt;
}
bool dfs(int dep,int lit,int top)
{
    if(dep>lit)return false;

    for(int i=0;i<top;i++)
    {
        save[top]=save[top-1]+save[i];

        if(save[top]==n)return true;
        if(dep+h(save[top])>lit)continue;
        if(dfs(dep+1,lit,top+1))return true;

        save[top]=abs(save[top-1]-save[i]);
        if(save[top]==n)return true;
        if(dep+h(save[top])>lit)continue;
        if(dfs(dep+1,lit,top+1))return true;
    }
    return false;
}
int main()
{
    while(scanf("%d",&n)!=EOF && n)
    {
        save[0]=1;
        if(n==1)printf("0\n");
        else
        for(int lit=1;;lit++)
        {
            if(dfs(1,lit,1))
            {
                printf("%d\n",lit);
                break;
            }
        }
    }
    return 0;
}


 


 

posted on 2013-12-20 12:07  我的小人生  阅读(285)  评论(0编辑  收藏  举报