题目大意:给出n,问说至少计算几步得到x^n。
解题思路:迭代深搜,枚举步数,然后深搜判断是否可行。需要优化,当当前数s按照最大方案执行后仍然小于n,则说明不可行。
// Created by Chenhongwei in 2015.
// Copyright (c) 2015 Chenhongwei. All rights reserved.
#include"iostream"
#include"cstdio"
#include"cstdlib"
#include"cstring"
#include"climits"
#include"queue"
#include"cmath"
#include"map"
#include"set"
#include"stack"
#include"vector"
#include"sstream"
#include"algorithm"
using namespace std;
typedef long long ll;
int n,num,dep,dp[1010];
bool dfs(int cur,int d)
{
if(d>=dep)
{
if(cur==n)
return true;
return false;
}
int maxn=0;
for(int j=0;j<num;j++)
maxn=max(dp[j],maxn);
if( (cur+maxn) << (dep-d-1) < n)
return false;
for(int i=num-1;i>=0;i--)
{
dp[num++]=cur+dp[i];
if(dfs(cur+dp[i],d+1))
return true;
num--;
dp[num++]=cur-dp[i];
if(dfs(cur-dp[i],d+1))
return true;
num--;
}
return false;
}
int main()
{
//ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(cin>>n&&n)
{
int temp=1;
dep=0;
while(n>temp)
{
temp*=2;
dep++;
}
while(1)
{
memset(dp,0,sizeof dp);
dp[0]=num=1;
if(dfs(1,0))break;
dep++;
}
cout<<dep<<endl;
}
return 0;
}