您的位置:首页 > 其它

poj 1980 Unit Fraction Partition…

2013-04-14 19:38 417 查看
这个用了double来判断相等与否,精度不太好把握,而且需要注意的东西也多一些

搜索顺下,t从小到大

剪枝 tmp>sum
tmp为接下来所能选择的最大的分母,sum为剩下的值

(1/t)*n<sum 不再搜索 剩下的值都选最大仍不能满足

当乘积大于a时 退出

#include <iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

using namespace std;

int ans;

double e=0.000000000001;

int dfs(double sum,int t,int n,double a)

{

// printf("%f
%d %d %f\n",sum,t,n,a);

if(fabs(sum)<e)

{

if(a>=(1-e)) ans++;

return(0);

}

double
tmp=(double)1/a;

if(tmp-e>sum) return(0);

for(int
i=t;;i++)

{

double tmp=(double)1/(double)i;

if(tmp-e>sum) continue;

if(tmp*n+e<sum) break;

if(i-e>a) break;

dfs(sum-tmp,i,n-1,a/i);

}

}

int main()

{

int
p,q,a,n;

while(1)

{

scanf("%d %d %d
%d",&p,&q,&a,&n);

if(p==0&&q==0&&a==0&&n==0)
break;

double sum=(double)p/(double)q;

ans=0;

dfs(sum,1,n,(double)a);

printf("%d\n",ans);

}

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: