UVA - 1374 Power Calculus (dfs迭代加深搜索)

题目:

输入正整数n(1≤n≤1000),问最少需要几次乘除法可以从x得到x?在计算过程中x的指数应当总是正整数。

思路:

dfs枚举次数深搜

注意:

1.指数如果小于0,就退出当前的搜索

2.now<<(MX-cur)<n即当前指数now乘以2^(MX-cur)还是小于n的话,就剪枝,因为乘以2^(MX-cur)得到的数是当前步数得到的最大的数。

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1000000009
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = 10000;
int buf[maxn],n,MX;

bool dfs(int cur,int now){
    if(now<0 || cur>MX || now<<(MX-cur)<n)
        return false;
    if(now==n || (now<<(MX-cur))==n)
        return true;
    buf[cur] = now;//用buf数组保存已经得到的now的值
    for(int i=0; i<=cur; i++){//遍历已经得到的now的值并进行加或减的计算
        if(dfs(cur+1,now+buf[i]))
            return true;
        if(dfs(cur+1,now-buf[i]))
            return true;
    }
    return false;
}

int main(){
    //FRE();
    while(scanf("%d",&n) && n){
        for(MX=0;!dfs(0,1); MX++);//枚举步数并进行dfs深搜
        printf("%d\n",MX);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/sykline/p/10318275.html
今日推荐