【题解】Unit Fraction Partition-C++

Description
给出数字P,Q,A,N,代表将分数P/Q分解成至多N个分数之和,这些分数的分子全为1,且分母的乘积不超过A。例如当输入数据为2 3 120 3时,我们可以得到以下几种分法:

 

Input
本题含有多组测试数据,每组给出四个数P,Q,A,N,其中 p,q <= 800, A <= 12000,N <= 7.当输入的四个数均为0时,代表测试结束.
Output
针对每组数据,输出共有多少种不同的分法。
Sample Input
2 3 120 3
2 3 300 3
2 3 299 3
2 3 12 3
2 3 12000 7
54 795 12000 7
2 3 300 1
2 1 200 5
2 4 54 2
0 0 0 0
Sample Output
4
7
6
2
42
1
0
9
3

这道题目依然是玄学的 DFS题目。
初拿到这道题目的时候,打开了CSDN(划去) 就懵了,这玩意分数咋存???
然后经过一波PY 呸认真思考,终于想出了解决的方法。
这道题目DFS的参数传的比较多,要把当前求到的分子分母分别当做参数传进下一层DFS,还要把当前乘积,上一个分母和分数个数传进去,不要问我为什么这道题限制条件真的多
然后每次拓展的下限就是上一个分母,因为很明显后面的分母都大于等于前面的分母,上限就是最大乘积除以当前乘积,因为当前乘积乘上这一个分母要小于等于最大乘积,移项一下就可以了,不移项也行。
代码就贴下面:“

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int p,q,n,a,ans=0;
 4 void dfs(int mol,int den,int pre,int dep,int fac)//分子,分母,上一个分母,深度,乘积 
 5 {
 6     if(fac>a)return;
 7     if(mol*q==den*p)
 8     {
 9         ans++;
10         return;
11     }
12     if(mol*q>den*p||dep==n)return;
13     for(int i=pre;fac*i<=a;i++)
14     {
15         dfs(mol*i+den,den*i,i,dep+1,fac*i);
16     }
17 }
18 int main()
19 {
20     while(cin>>p>>q>>a>>n&&q)
21     {
22         ans=0;
23         dfs(0,1,1,0,1);
24         cout<<ans<<endl; 
25     }
26     return 0;
27 }
个人博客地址: www.moyujiang.com 或 moyujiang.top
原文地址:https://www.cnblogs.com/moyujiang/p/11213321.html