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; }