poj 3134 IDA*
题意:由x通过乘除运算出x^n,最少需要多少补
分析:看上就是一个搜索,无法准确估计深度,非常适合IDA*这样的算法,固定深度,然后搜索,直接搜索会超时,需要一些强力剪枝,如果到达某一个状态,maxd*(2^(depth-d))<n,这样的状态是无法到达的,因为每一次都是乘,都要小于n,这样的减去,n只有1000,打表发现答案最多是13,所以,再加一个剪枝,如果到12依然没有答案,直接输出13
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,a[15],dep;
bool dfs(int cnt,int maxd){
if(a[cnt]==n)return true;
if(cnt>=dep)return false;
maxd=maxd<a[cnt]?a[cnt]:maxd;
if(maxd*(1<<(dep-cnt))<n)return false;
for(int i=0;i<=cnt;i++){
a[cnt+1]=a[cnt]+a[i];
if(dfs(cnt+1,maxd))return true;
a[cnt+1]=a[cnt]-a[i];
if(a[cnt+1]<0)a[cnt+1]*=-1;
if(dfs(cnt+1,maxd))return true;
}
return false;
}
int main(){
a[0]=1;
while(~scanf("%d",&n)&&n){
int ans=-1;
if(n==1){puts("0");continue;}
for(dep=1;dep<=12;dep++)
if(dfs(0,1)){ans=dep;break;}
if(ans<0)ans=13;
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号