2013寒假练习 1039 Unit Fraction Partition

来源:互联网 发布:投诉淘宝店铺 编辑:程序博客网 时间:2024/05/13 16:11

地址:http://acm.bit.edu.cn/mod/programming/view.php?a=525

将一个给定分数划分成许多单位分数之和,限制这些单位分数分母之积不能超过a,个数不能超过n,求方法总数。

给了那么多贴心限制肯定是DFS啦,注意假设所选分数分母非递减,防止重复。

自己写的0.14s。。那些0.008估计是利用了什么性质优化了?

#include<iostream>using namespace std;typedef struct FENSHU{int zi,mu;}fenshu;fenshu init;inline fenshu operator - (fenshu a,fenshu b) //改成内联函数 0.236s --> 0.14s{fenshu ans;ans.zi=a.zi*b.mu-a.mu*b.zi,ans.mu=a.mu*b.mu;return ans;}int ans;int a,n;void dfs(fenshu now,int num,int pro,int last) //now当前还剩的分数值,num当前最多还能分几个,pro已选分母乘积,last 上一个选的分母{fenshu next,temp;temp.zi=num,temp.mu=last;temp=now-temp;if(temp.zi>0) return;  //若剩下全取最大也不够了   0.396s --> 0.236sif(now.zi==0)                  {ans++;return;}if(num==0) return;for(int i=a/pro;i>=last;i--){temp.zi=1,temp.mu=i; //所选单位分数next=now-temp;if(next.zi<0) break; dfs(next,num-1,pro*i,i);}}int main(){while(scanf("%d%d%d%d",&init.zi,&init.mu,&a,&n),init.zi&&init.mu&&a&&n){ans=0;dfs(init,n,1,0);printf("%d\n",ans);}return 0;}


 

原创粉丝点击