题目:
输入正整数n(1≤n≤1000),问最少需要几次乘除法可以从x得到xn ?在计算过程中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\n",MX); } return 0; }