POJ_1980_Unit Fraction Partition

//经过木棍,蛋糕等等剪枝要求较高的题目之后,这道题倒也不是很难了,还是要注意一下细节 //细节决定成败啊 #include<stdio.h> #include<string.h> int num[10]; int p,q,m,n; int ans; //求最小公倍数 int lcm(int x,int y) { int t,a=x,b=y; if(x<y) { t=x;x=y;y=t; } while(x%y) { t=x%y; x=y; y=t; } return a*b/y; } //last为上一个真分数的分母,times为确定第几个真分数,fenmu为前面已经的分母,product //为前面确定的分母之积 int dfs(int last,int times,int fenmu,int sum,int product) { int i,j,t,temp;; //超过n个数返回 if(times==n+1) return 0; //确定分母的上下界 for(i=last;i<=m/product;i++) { int k=lcm(fenmu,i); t=k/fenmu*sum; temp=k/q*p; //分母的积大于a返回 if(product*i>m) return 0; //若剩余分数大于当前确定分母所能达到的最大值,返回 if(temp>t+k/i*(n-times+1)) return 0; if(temp==t+k/i) { ans++; num[times]=i; continue; } //还有剩余分数,可以继续向下深度搜索 if(temp>t+k/i) { num[times]=i; dfs(i,times+1,k,t+k/i,product*i); } } return 0; } int main() { //freopen("c4.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d%d%d",&p,&q,&m,&n)==4) { memset(num,0,sizeof(num)); if(p==0&&q==0&&m==0&&n==0) break; ans=0;num[0]=q; dfs(1,1,q,0,1); printf("%d/n",ans); } return 0; }

你可能感兴趣的:(c,IM)