LA3621(dfs)

来源:互联网 发布:剑三捏脸数据 成女 编辑:程序博客网 时间:2024/06/05 12:09

题目大意:
已知n,求x最少经过多少次的乘除法可以使得达到x ^n

思路:
因为可以乘除,所以要进行回溯
dfs
用一个num表示当前步数
用step表示最多多少步

代码:

#include <iostream>using namespace std;#include <cstring>#include <algorithm>#include <stdio.h>const int MAXN = 1010;const int INF = 0x3f3f3f3f;int arr[MAXN],num;int dfs(int n,int step) {    if(num > step)        return 0;    if(arr[num] == n)        return 1;    if(arr[num] << (step - num) < n)        return 0;    for(int i = 0; i <= num; i++) {        num++;        arr[num] = arr[num - 1] + arr[i];        if(arr[num] <= 10000 && dfs(n,step))            return 1;        arr[num] = arr[num - 1] - arr[i];        if(arr[num] > 0 && dfs(n,step))            return 1;        num--;    }    return 0;}int main() {    int n;    while(scanf("%d",&n) != EOF && n) {        int i;        for(i = 0;;i++) {            arr[num = 0] = 1;            if(dfs(n,i))                break;        }        printf("%d\n",i);    }    return 0;}
0 0
原创粉丝点击