UVA 1374 Power Calculus

来源:互联网 发布:进入编程模式错误 编辑:程序博客网 时间:2024/06/08 02:40


IDA*求解。


程序代码:

#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <map>using namespace std;const int maxn = 1010;int n, maxd;int arr[110];bool check(int x, int len) {    for(int i = 0; i < len; ++i) {        if(arr[i] == x) {            return true;        }    }    return false;}int get_max(int len) {    int ans = -1;    for(int i = 0; i < len; ++i) {        ans = max(ans, arr[i]);    }    return ans;}bool dfs(int cur) {    if(cur == maxd) {        if(check(n, cur + 1)) {            return true;        }        return false;    }    int h = get_max(cur + 1);    if(h*(1<<(maxd-cur)) < n) return false;    //if(arr[cur] < n) {        for(int i = cur; i >= 0; --i) {            if(arr[cur] < n) {                arr[cur+1] = arr[i] + arr[cur];                if(dfs(cur + 1)) return true;            }            arr[cur+1] = arr[cur] - arr[i];            if(arr[cur+1] <= 0) continue;            if(dfs(cur + 1)) return true;        }    //}    return false;}int main() {    //freopen("aa.in", "r", stdin);    while(scanf("%d", &n) != EOF) {        if(n == 0) break;        if(n == 1) {            printf("0\n");        } else {            for(maxd = 1; ; ++maxd) {                arr[0] = 1;                if(dfs(0)) {                    printf("%d\n", maxd);                    break;                }            }        }    }    return 0;}


0 0