zoukankan      html  css  js  c++  java
  • UVA

    题目:

    输入正整数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
    ",MX);
        }
        return 0;
    }
  • 相关阅读:
    描述网络的优点与缺点
    外键之表格三种关系
    Mysql完整性约束
    Mysql数据类型
    mysql的基本语句
    Mysql的基本安装
    type与object的关系
    反射
    面向对象内置方法(进阶)
    Python 的五种io模型理解
  • 原文地址:https://www.cnblogs.com/sykline/p/10318275.html
Copyright © 2011-2022 走看看