算法点心----求出用1,2,5这三个数不同个数组合的和为100的组合个数。
如:100个1是一个组合,5个1加19个5是一个组合......
这是最近去中国移动深圳分公司笔试时 ,遇到的一道算法题,咋一看,很快写出来了:
即x+2y+5z=100,并且条件为x<=100,y<=50,z<=20
程序就如下:
int number=0;
虽然觉得应该有更高效的方法,不过碍于时间不够,就没再优化,回来后到网上找了一下,果真有优化方法,一下引用自他处:
上面这个程序一共要循环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的组合个数。相关推荐
- 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树
之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...
- 假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法。
假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法. #include<iostream>//蓝多多算法实验五:二叉树的应用(二) #inclu ...
- 算法:通过普利姆(Prim)算法,求出图的最小生成树
请看如下的示例图,该图有 V1-V7 七个顶点,每个顶点之间的距离如图所示: 如果上面的图为七个城市的地理分布图,城市间相连的边上的数字为城市间的距离.我们要在这七个城市里面架设电线,使得每一个城市都 ...
- Python算法题----求出和为S的所有连续正整数数列
从1开始,求出所有的和为21的连续正整数数列.比如1+2+3+4+5+6 和为 21, 6+7+8和为21. 解法:该题目仍然需要首尾两个指针,一个为start,一个为end.sum=start+en ...
- 一个赛马问题 25匹马5个赛道,每个赛道每次只能跑一匹马,问需要跑几次,能求出跑得最快的三匹马。...
肯定 7 次 25匹马先设5组:假设A,B,C,D,E五组 跑5轮后选每组前3名进下一轮 每组第一名比赛一轮(第6圈)得出第一名(假设A1)第二名(假设B1)第三名(假设C1) 从(第6圈)第一名组中 ...
- 求用1,2,5这三个数不同个数组合的和为100的组合个数
这个题目其实很简单,直接利用dfs就出来,复杂度为O(100*50*20)可是看网上一个很好的分析,时间复杂度特别小. 分析: 假设a*1 + b*2 + c*5 = 100;非常容易看出c的循环次数 ...
- php算法求出一个数可以被分解成多少个_小学奥数必须掌握的30个知识模块汇总...
关注成长教育 解决学习困惑 点击蓝字关注,与全国家长比肩同行 1.和差倍问题和差问题 和倍问题 差倍问题已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数公式适用范围 已知两个数的和,差, ...
- php算法求出一个数可以被分解成多少个_最全的小学干货:34个数学重难点公式(三)...
1.和差倍问题: 和差问题 和倍问题 差倍问题 已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数 公式适用范围 已知两个数的和,差,倍数关系 公式 ①(和-差)÷2=较小数 较小数+差=较 ...
- php算法求出一个数可以被分解成多少个_小学数学必考的34个数学重难点公式,赶紧给孩子收藏!...
34个小学数学重难点公式 1.和差倍问题 2.年龄问题的三个基本特征 ①两个人的年龄差是不变的: ②两个人的年龄是同时增加或者同时减少的: ③两个人的年龄的倍数是发生变化的: 3.归一问题的基本特点 ...
- 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和
编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和 目录 题目描述 代码实现 题目描述 求出一个整数中各位数上所包含全部质数之和 一家电子商务公司计划在圣诞节给客户提供特别折扣,他们 ...
最新文章
- 没想到图像直方图有这么多应用场景
- CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解
- 创建实现一个简单的web项目
- apache 支持php urlmanager,Yii中urlManager的配置
- flask导入flask-sqlalchemy的一个问题记录
- MySQL命令窗口出现中文乱码的解决方法
- php 五子棋源联机版_PHP五子棋服务器代码
- BRVAH官方使用指南(持续更新)
- OpenPose 参数说明
- word生成html目录树,word将自定义目录做成模板
- 台式计算机能分享热点吗,台式机能做wifi热点吗
- VTM3.0代码阅读:CU、PU、TU
- JZOJ_2499_东风谷早苗 (Standard IO)
- python+FFmpeg实现对m3u8文件内的ts视频多线程下载、解密、合并成MP4,并输出。
- excel日期函数的应用
- 阿里云 ECS 构建集群
- C1认证快速复习重点个人总结(一、计算机通识【下】),部分内容同任务文档
- uniapp兼容iPhoneX头部状态栏(刘海屏)和底部小横条
- 用计算机弹音乐乐谱小幸运,小幸运——歌词和弦版本钢琴谱
- 希望各位博友解答一下