UVA1374-Power Calculus(DFS剪枝)

Power Caculus

题意:给出一个n,求最少计算几步可以得到 x^{n}  。

  • 枚举最大次数,然后DFS判断是否可行,将到达的地方储存在数组中乘除运算。注意最大计算都无法达到 n 和已经超过 n 时需要剪枝。
  • 主要看代码,注释很详细。
  • // zyc 2018/7/23
    
    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e3 + 7;
    const int M = 1e9 + 7;
    
    int a[100], n;
    bool dfs (int now, int num, int steps)
    {
        // 储存已经到过的地方
        a[num] = now;
    
        // 剪枝
        if (num > steps) return false;
        if (now << (steps - num) < n) return false;
    
        // 判断条件是否符合
        if (now == n || now << (steps - num) == n) return true;
    
        // 暴搜 乘或除
        for (int i = 0; i <= num; i ++) {
            if (dfs(now + a[i], num + 1, steps)) return true;
            if (now - a[i] > 0 && dfs(now - a[i], num + 1, steps)) return true;
        }
        return 0;
    }
    int main ()
    {
        int i;
        while (scanf ("%d", &n) && n!= 0) {
            // 枚举最大步数
            for (i = 0; ; i ++) {
                memset (a, 0, sizeof (a));
                if (dfs(1, 0, i)) break;
            }
            printf ("%d\n", i);
        }
    }
    

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值