埃及数字的代码实现

来源:互联网 发布:五毛钱特效软件电脑 编辑:程序博客网 时间:2024/05/02 09:10
</pre><p>中间居然用int会数据溢出,注意用LL就行了,IDA*算法 深度迭代的应用<em></em></p><p></p><pre name="code" class="cpp">#include<cstdio>#include<iostream>#include<cstring>using namespace std;unsigned long long u,d,cnt=1,ans[1000],best[1000];unsigned long long gcd(unsigned long long a,unsigned long long b){if(b>a)a^=b^=a^=b;return b>0?gcd(b,a%b):a;}void pure(unsigned long long&a,unsigned long long&b){unsigned long long c=gcd(a,b);a=a/c;b=b/c;                        //对ab进行通分}unsigned long long okmin(unsigned long long u,unsigned long long d){unsigned long long i=0;while(1){if(i*u>=d){return i;}i++;}}void better(unsigned long long maxd){   //更新较好的答案bool jd=true;for(unsigned long long i=0;i<=maxd;i++)cout<<ans[i]<<" ";cout<<"\n";for(int i=maxd;i>=0;i--){if(ans[i]>best[i]){jd=true;break;}}if(jd||best[0]==-1){for(unsigned long long i=0;i<=maxd;i++){best[i]=ans[i];}}}bool t=false; //作为找到解的标志void dfs(unsigned long long maxd,unsigned long long curd,unsigned long long maxn){if(maxd<curd){better(maxd);t=true;return;}unsigned long long g=okmin(u,d);g=max(g,maxn+1);while((maxd-curd+1)*d>=u*g){  //基于深度的枝剪unsigned long long tu=u,td=d;ans[curd]=g;u=u*g-d;d=td*g;pure(u,d);dfs(maxd,curd+1,g);u=tu;d=td;g++;}}int main(){while(cin>>u>>d){t=false;pure(u,d);cout<<"case "<<cnt++<<" \n";unsigned long long maxd=-1;memset(best,-1,sizeof(best));while(1){maxd++;unsigned long long tem=okmin(u,d);dfs(maxd,0,tem-1);if(t)break;}for(unsigned long long i=0;i<=maxd;i++)cout<<best[i]<<" ";}}

0 0
原创粉丝点击