第六届蓝桥杯校内选拔赛C/C++高职组解题(6)

作者: admin 日期: 2015-05-02 22:29:52 人气: - 评论: 0

形如:1/a 的分数称为单位分数。


可以把1分解为若干个互不相同的单位分数之和。
例如:
1 = 1/2 + 1/3 + 1/9 + 1/18
1 = 1/2 + 1/3 + 1/10 + 1/15
1 = 1/3 + 1/5 + 1/7 + 1/9 + 1/11 + 1/15 + 1/35 + 1/45 + 1/231
等等,类似这样的分解无穷无尽。


我们增加一个约束条件:最大的分母必须不超过30


请你求出分解为n项时的所有不同分解法。


数据格式要求:


输入一个整数n,表示要分解为n项(n<12)
输出分解后的单位分数项,中间用一个空格分开。
每种分解法占用一行,行间的顺序按照分母从小到大排序。


例如,
输入:
4
程序应该输出:
1/2 1/3 1/8 1/24
1/2 1/3 1/9 1/18
1/2 1/3 1/10 1/15
1/2 1/4 1/5 1/20
1/2 1/4 1/6 1/12


再例如,
输入:
5
程序应该输出:
1/2 1/3 1/12 1/21 1/28
1/2 1/4 1/6 1/21 1/28
1/2 1/4 1/7 1/14 1/28
1/2 1/4 1/8 1/12 1/24
1/2 1/4 1/9 1/12 1/18
1/2 1/4 1/10 1/12 1/15
1/2 1/5 1/6 1/12 1/20
1/3 1/4 1/5 1/6 1/20




资源约定:
峰值内存消耗 < 256M
CPU消耗  < 2000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。


注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。


提交时,注意选择所期望的编译器类型。


只想到了暴力搜索的方法代码如下效率还不是很好欢迎交流

参考代码

  1. #include <iostream>  
  2. #include <cmath>  
  3. #include <string>  
  4. #include <windows.h>  
  5. #include <stack>  
  6. #include <vector>  
  7. #include <iomanip>   
  8. #include <stack>   
  9. #include <set>  
  10. #include <map>  
  11. #include <cstdio>  
  12. using namespace std;  
  13. int N;   
  14. int count=0;  
  15. int counts=0;   
  16. double Table[31][30];//表示从第n个数到之后连续m个数的和   
  17. void coutvector(vector<int> d)  
  18. {  
  19.     for(int i=0;i<d.size();i++)  
  20.         cout<<"1/"<<d[i]<<" ";  
  21.     cout<<endl;  
  22. }  
  23. double getvectorsum(vector<int> d)  
  24. {  
  25.     double ret=0;  
  26.     for(int i=0;i<d.size();i++)  
  27.         ret+=(double)1/(double)d[i];  
  28.     return ret;  
  29. }  
  30. void dsf(vector<int> d)  
  31. {  
  32.     count++;  
  33.     if(count>=1000)  
  34.     {  
  35.         counts++;  
  36.         count=0;  
  37.     }  
  38.     double sum=getvectorsum(d);//获得当前队列最大值   
  39.       
  40.       
  41.     if((sum-(1.0/30.0))>1 )  
  42.     {  
  43.         d.pop_back();  
  44.         return;  
  45.     }  
  46.     if(d.size()==N)  
  47.     {  
  48.         if(fabs(sum-1) <1e-8)   
  49.             coutvector(d);   
  50.         d.pop_back();  
  51.         return;  
  52.     }  
  53.     if(d.size()>0)  
  54.     {  
  55.         if(1-sum>Table[d[d.size()-1]][N-d.size()])  
  56.         {  
  57.             d.pop_back();  
  58.             return;  
  59.         }  
  60.     }  
  61.       
  62.     int k=2;  
  63.     if(d.size()!=0)  
  64.         k=d[d.size()-1]+1;  
  65.     for(int i=k;i<=30;i++)  
  66.     {  
  67.         d.push_back(i);  
  68.         dsf(d);  
  69.         d.pop_back();  
  70.     }  
  71.       
  72. }  
  73. int main()  
  74. {  
  75.     //初始化TABLE   
  76.     for(int i=2;i<=30;i++)  
  77.     {  
  78.         Table[i][0]=0;  
  79.         for(int j=1;j<=(30-i);j++)  
  80.             Table[i][j]=Table[i][j-1]+(1.0/(double)(i+j));  
  81.     }  
  82.     cin>>N;   
  83.     vector <int> i;  
  84.     dsf(i);  
  85.     cout<<"总共计算了"<<counts<<"*千次"<<endl;  
  86.     return 0;  
  87. }  


发表评论
更多 网友评论0 条评论)
暂无评论

Copyright © 2012-2014 我的代码板 Inc. 保留所有权利。

页面耗时0.0300秒, 内存占用1.95 MB, 访问数据库16次

闽ICP备15009223号-1