https://vjudge.net/problem/UVA-1374
题意就是最少多少次运算可以得到这个次方数
因为只有加法和减法两个运算。
枚举的比较多。
所以要进行比较强的剪枝
首先枚举深度计算
之后 如果最高位置最大方式运算也无法达到n的话就剪掉。
#include <bits/stdc++.h>
using namespace std;
int n,maxs,tag[1000],z;
void dfs(int l,int now)
{
if(z||l>maxs||now<0||now<<(maxs-l)<n) return ;
if(now==n)
{
z=1;
return ;
}
tag[l]=now;
for(int i=0;i<=l;i++)
dfs(l+1,now+tag[i]);
for(int i=0;i<=l;i++)
dfs(l+1,now-tag[i]);
}
int main()
{
while(cin>>n&&n)
{
for(maxs=0,z=0;!z;maxs++)
{
z=0;
dfs(0,1);
if(z) break;
}
cout<<maxs<<endl;
}
return 0;
}