写一个程序, 要求功能:求出用1,2,5这三个数不同个数组合的和为100的组合个数。
如:100个1是一个组合,5个1加19个5是一个组合......

这是最近去中国移动深圳分公司笔试时 ,遇到的一道算法题,咋一看,很快写出来了:

即x+2y+5z=100,并且条件为x<=100,y<=50,z<=20

程序就如下:

int number=0;

for (x=0; x<=100; x++)
for (y=0; y<=50; y++)
for (z=0; z<=20; z++)
if ((x+2*y+5*z)==100)
number++;

虽然觉得应该有更高效的方法,不过碍于时间不够,就没再优化,回来后到网上找了一下,果真有优化方法,一下引用自他处:

上面这个程序一共要循环100*50*20次,效率实在是太低了
事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。我的解法如下:
因为x+2y+5z=100
所以x+2y=100-5z,且z<=20 x<=100 y<=50
所以(x+5z)<=100,且(x+5z)是偶数
对z作循环,求x的可能值如下:

z=0, x=100, 98, 96, ... 0
z=1, x=95, 93, ..., 1
z=2, x=90, 88, ..., 0
z=3, x=85, 83, ..., 1
z=4, x=80, 78, ..., 0
......
z=19, x=5, 3, 1
z=20, x=0

因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,
即为:
(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1

某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2
某个奇数m以内的奇数个数也可以表示为(m+2)/2

所以,求总的组合次数可以编程为:
number=0;
for (int m=0;m<=100;m+=5)
{
number+=(m+2)/2;
}
cout<<number<<endl;
这个程序,只需要循环21次, 两个变量,就可以得到答案,比上面的那个程序高效了许多
倍----只是因为作了一些简单的数学分析

这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事——这不是一个专业的研发人员的行为。

那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法的正确性,在调试阶段,这非常有用。在很多大公司,例如微软,都采用了这种方法:在调试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保证是正确的),那么说明优化的算法出了问题,需要修改。
可以举例表示为:
#ifdef DEBUG
int simple();
#end if
int optimize();
......
in a function:
{
result=optimize();
ASSERT(result==simple());
}
这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。同时,在程序的发布版本,却不会包含笨重的simple()函数。——任何大型工程软件都需要预先设计良好的调试手段,而这里提到的就是一种有用的方法。
**************************************************可执行代码******************************************

#include <iostream>
#include <cmath>
using namespace std;

int SimpleSolution();
int optimize();
void main()
{
int number1,number2;
cout<<"求用1,2,5这三个数不同个数组合的和为100的组合个数"<<endl;
number1=SimpleSolution();
cout<<"Simple solution:"<<number1<<endl;
    number2=optimize();
cout<<"Optimize solution:"<<number2<<endl;
}

int SimpleSolution()
{
int number(0);
for(int i=0;i<=100;i++)
   for(int j=0;j<=50;j++)
    for(int k=0;k<=20;k++)
    {
     if(i+2*j+5*k==100)
      number++;
    }
return number;
}

int optimize()
{
int number=0;
for(int m=0;m<=100;m+=5)
{
       number+=(m+2)/2;
}
return number;

}

转载于:https://www.cnblogs.com/skywithcloud/archive/2011/12/18/2291817.html

算法点心----求出用1,2,5这三个数不同个数组合的和为100的组合个数。相关推荐

  1. 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树

    之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...

  2. 假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法。

    假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法. #include<iostream>//蓝多多算法实验五:二叉树的应用(二) #inclu ...

  3. 算法:通过普利姆(Prim)算法,求出图的最小生成树

    请看如下的示例图,该图有 V1-V7 七个顶点,每个顶点之间的距离如图所示: 如果上面的图为七个城市的地理分布图,城市间相连的边上的数字为城市间的距离.我们要在这七个城市里面架设电线,使得每一个城市都 ...

  4. Python算法题----求出和为S的所有连续正整数数列

    从1开始,求出所有的和为21的连续正整数数列.比如1+2+3+4+5+6 和为 21, 6+7+8和为21. 解法:该题目仍然需要首尾两个指针,一个为start,一个为end.sum=start+en ...

  5. 一个赛马问题 25匹马5个赛道,每个赛道每次只能跑一匹马,问需要跑几次,能求出跑得最快的三匹马。...

    肯定 7 次 25匹马先设5组:假设A,B,C,D,E五组 跑5轮后选每组前3名进下一轮 每组第一名比赛一轮(第6圈)得出第一名(假设A1)第二名(假设B1)第三名(假设C1) 从(第6圈)第一名组中 ...

  6. 求用1,2,5这三个数不同个数组合的和为100的组合个数

    这个题目其实很简单,直接利用dfs就出来,复杂度为O(100*50*20)可是看网上一个很好的分析,时间复杂度特别小. 分析: 假设a*1 + b*2 + c*5 = 100;非常容易看出c的循环次数 ...

  7. php算法求出一个数可以被分解成多少个_小学奥数必须掌握的30个知识模块汇总...

    关注成长教育  解决学习困惑 点击蓝字关注,与全国家长比肩同行 1.和差倍问题和差问题 和倍问题 差倍问题已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数公式适用范围 已知两个数的和,差, ...

  8. php算法求出一个数可以被分解成多少个_最全的小学干货:34个数学重难点公式(三)...

    1.和差倍问题: 和差问题 和倍问题 差倍问题 已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数 公式适用范围 已知两个数的和,差,倍数关系 公式 ①(和-差)÷2=较小数 较小数+差=较 ...

  9. php算法求出一个数可以被分解成多少个_小学数学必考的34个数学重难点公式,赶紧给孩子收藏!...

    34个小学数学重难点公式 1.和差倍问题 2.年龄问题的三个基本特征 ①两个人的年龄差是不变的: ②两个人的年龄是同时增加或者同时减少的: ③两个人的年龄的倍数是发生变化的: 3.归一问题的基本特点 ...

  10. 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和

    编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和 目录 题目描述 代码实现 题目描述 求出一个整数中各位数上所包含全部质数之和 一家电子商务公司计划在圣诞节给客户提供特别折扣,他们 ...

最新文章

  1. 没想到图像直方图有这么多应用场景
  2. CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解
  3. 创建实现一个简单的web项目
  4. apache 支持php urlmanager,Yii中urlManager的配置
  5. flask导入flask-sqlalchemy的一个问题记录
  6. MySQL命令窗口出现中文乱码的解决方法
  7. php 五子棋源联机版_PHP五子棋服务器代码
  8. BRVAH官方使用指南(持续更新)
  9. OpenPose 参数说明
  10. word生成html目录树,word将自定义目录做成模板
  11. 台式计算机能分享热点吗,台式机能做wifi热点吗
  12. VTM3.0代码阅读:CU、PU、TU
  13. JZOJ_2499_东风谷早苗 (Standard IO)
  14. python+FFmpeg实现对m3u8文件内的ts视频多线程下载、解密、合并成MP4,并输出。
  15. excel日期函数的应用
  16. 阿里云 ECS 构建集群
  17. C1认证快速复习重点个人总结(一、计算机通识【下】),部分内容同任务文档
  18. uniapp兼容iPhoneX头部状态栏(刘海屏)和底部小横条
  19. 用计算机弹音乐乐谱小幸运,小幸运——歌词和弦版本钢琴谱
  20. 希望各位博友解答一下

热门文章

  1. iOS 实现搜索关键字高亮
  2. LeetCode131:Palindrome Partitioning
  3. placeHolder 兼容所有浏览器
  4. ubuntu11.04下安装TCL及TK
  5. mysql优化20条原则
  6. [置顶] 程序员成长路上的团队修炼之道
  7. 崩坏学园2及大部分采用ETC1压缩格式的Unity3D游戏的拆包图处理
  8. NetOps Defined
  9. 加/减/乘/除 下的取余
  10. centos下yum安装wget失败