题目链接:点击打开链接
题意:题目有公式,看公式和数据就可以明白。
思路:刚开始学IDA*算法,并不是太懂,这儿就不介绍算法了,这就算模板题了,
#include <stdio.h>
#include <string.h>
#include <math.h>
int num[100000];
int n,m,flag;
void dfs(int d)
{
if(d>m||num[d]<<(m-d)<n) //减枝 ,m为IDA*d的上限,d不能大于m,还有m-d次操作,
return ; //假若当前值此后m-d次,每次都翻倍,却依旧小于n,则不可能到n,即return ,
if(num[d]==n)
{
flag=1;
return ;
}
int t;
if(flag)
return ;
for(int i=d; i>=0; i--)
{
t=num[d]+num[i];
if(t<2000&&t>0)
{
num[d+1]=t;
dfs(d+1);
}
t=num[d]-num[i];
if(t<2000&&t>0)
{
num[d+1]=t;
dfs(d+1);
}
}
return ;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
num[0]=1;
flag=0;
for(m=0;; m++)
{
dfs(0);
if(flag)
break;
}
printf("%d\n",m);
}
return 0;
}