• 【题解】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
  • 相关阅读:
    javascript游戏引擎
    BI 可视化
    nodeJS 相关开源项目
    bean validation 技术规范
    JForum 源码分析
    lemon OA 我长时间经历的第一个开源项目
    Rete算法
    摘自知乎--mysql
    copy and paste ,做到这样也很牛逼了
    servlet 3.0特性说明
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11213321.html
Copyright © 2020-2023  润新知