UVa1374 Power Calculus (IDA*)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa1374 Power Calculus (IDA*)相关的知识,希望对你有一定的参考价值。

链接:http://acm.hust.edu.cn/vjudge/problem/41552
分析:枚举最大深度maxd,每次总是使用“刚刚得到”的那个数(LRJ说的我信了),每次递归枚举a[d+1],两种方式a[d]+或-去a[i],找到解返回true,否则直至枚举结束都没有找到解则返回false,dfs出口有四个,一是a[d]==n,说明最少用d次操作能得到目标,二是枚举完所有a[d+1]也没找到解,然后加上两个剪枝,深度大于等于最大深度还有乐观估计接下来maxd-d次每次都取指数最大相加但结果还是小于n都返回失败false。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;dfs
 4 
 5 int n, a[13];
 6 
 7 bool dfs(int d, int maxd) {
 8     if (a[d] == n) {
 9         printf("%d\n", d);
10         return true;
11     }
12     if (d == maxd) return false;
13     int maxv = a[0];
14     for (int i = 1; i <= d; i++) maxv = max(maxv, a[i]);
15     if ((maxv << (maxd - d)) < n) return false;
16     for (int i = d; i >= 0; i--) {
17         a[d + 1] = a[d] + a[i];
18         if (dfs(d + 1, maxd)) return true;
19         if (a[d] - a[i] <= 0) continue;
20         a[d + 1] = a[d] - a[i];
21         if (dfs(d + 1, maxd)) return true;
22     }
23     return false;
24 }
25 
26 void solve() {
27     if (n == 1) printf("%d\n", 0);
28     else {
29         a[0] = 1;
30         for (int maxd = 1; ; maxd++)
31             if (dfs(0, maxd)) break;
32     }
33 }
34 
35 int main() {
36     while (scanf("%d", &n) == 1 && n > 0) solve();
37     return 0;
38 }

 

以上是关于UVa1374 Power Calculus (IDA*)的主要内容,如果未能解决你的问题,请参考以下文章

UVA1374-Power Calculus(迭代加深搜索)

UVA 1374 Power Calculus

UVa1374 Power Calculus(IDA*)

Power Calculus UVA - 1374 迭代加深搜索

UVa 1374 - Power Calculus——[迭代加深搜索快速幂]

迭代加深搜索(以Power Calculus POJ--3134 UVa--1374为例)