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;
}
搜索顺下,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;
}
相关文章推荐
- poj 1980 Unit Fraction Partition 分数划分,将分数分解为n个真分数之和,分母乘积不超过a
- poj 1980 Unit Fraction Partition
- poj 1980 Unit Fraction Partition 深搜剪枝
- POJ 1980 Unit Fraction Partition(dfs)
- [POJ1980]Unit Fraction Partition(搜索)
- poj 1980 dfs+剪枝(Unit Fraction Partition)
- Poj 1980 Unit Fraction Partition (分数分解 搜索)
- poj-1980 Unit Fraction Partition **
- [POJ 1980] Unit Fraction Partition Dfs
- POJ_1980_Unit Fraction Partition
- POJ 2485 Highways
- ZZULI_TEAM_PRACTICE(1) POJ 3790…
- ZOJ 1504(POJ 1244) Slots of Fun…
- ACM: 初中数学 poj 1328
- ACM: 计算交换次数的排序题 poj 22…
- ACM: polya定理 数论题 poj 2409
- ACM: 最大流 图论题 poj 1797
- ACM: 动态规划 poj 1160 终于有点…
- ACM: 有向欧拉图 图论题 poj 1386 …
- ACM: 三分法 poj 1018 (学习到三…