分数拆分

来源:互联网 发布:win10安装linux虚拟机 编辑:程序博客网 时间:2024/04/27 18:44

 分数拆分
2010/05/15 下午 08:51
题目

我们的目的是将一个分数拆分成若干个分子是1分母是正整数的分数之和的形式。例如2/3可以拆分成1/2+1/6的形式。这里不考虑顺序,比如1/6+1/2和1/2+1/6相同。
输入p, q, a, n, 其中p/q为分数,对这个分数进行拆分,要求拆分的分数个数不能多于n个,所有分母的乘积不能大于a。求有多少种拆分方法?
输入:最多200组数据。在每行中都有四个数分别表示p, q, a, n,之间以空格隔开,并且满足p,q<=800,a<=12000,n<=7,最后以四个0做为输入的结束。

输入示例:
2 3 120 3
2 3 300 3
0 0 0 0

输出示例:
4
7

解题思路

此题是深度优先遍历。

left*(double)1/i>=sum-bond&&i*cura<=a+bond


这个作为遍历终止条件,left为个数,初始的情况为n个,start是指从分母为1开始向下遍历,直到不满足题目条件为止。其中当sum值基本接近p/q的值是确定一种拆分方法,最终输出answer值即可。

#include<iostream>using namespace std;double bond=1e-11;int p,q,a,n;int answer;void dfs(int start,double sum,int cura,int left){if(sum<-1*bond)   return;if(sum<=bond&&sum>=-1*bond){   answer++;   return;}else{   int i;   for(i=start;left*(double)1/i>=sum-bond&&i*cura<=a+bond;i++)   {                              dfs(i,sum-(double)1/i,i*cura,left-1);   }}}int main(){cin>>p>>q>>a>>n;while(p!=0&&q!=0&a!=0&&n!=0){   answer=0;   dfs(1,(double)p/q,1,n);   cout<<answer<<endl;   cin>>p>>q>>a>>n;}return 0;}


 

原创粉丝点击