zoukankan      html  css  js  c++  java
  • 【题解】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
  • 相关阅读:
    Window黑客编程之资源释放技术
    实战|一个表白墙引发的“血案”
    【T1543.003】利用 ACL 隐藏恶意 Windows 服务
    exe调用DLL的方式
    要点4:C的文件操作
    regsvr32 bypass windows defender 新思路
    使用Zolom内存解析运行python脚本(不落地)
    在不影响程序使用的情况下添加shellcode
    要点2:循环、条件控制
    要点3:输入函数对比与自定义输入方式
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11213321.html
Copyright © 2011-2022 走看看