一道编程题: 在1~n之间选择若干个数,使其和为m
这是一道很明显的动态规划的题目。
递推公式为
用sum(n, m)表示所有可能的1~n之间存在的和为m的组合
那么 sum(n,m) = sum(n-1, m) | sum(n-1, m-n)
直接上代码
void FindCombine(std::list<int> la, int n,int m)
{
if(m < )
return ; if(m == )
{
for(std::list<int>::iterator iter = la.begin();iter!=la.end();iter ++)
{
std::cout<<*iter<<"+";
}
cout << endl;
return ;
} if(n <= )
{
return ;
} la.push_back(n);
FindCombine(la,n-,m-n);
la.pop_back(); FindCombine(la,n-,m);
}
如果允许选择重复的数字呢?
递推公式为
sum(n,m) = sum(n-1, m) | sum(n, m-n)
只需要将上面的代码稍作修改
void FindCombine(std::list<int> &la, int n,int m)
{ if(n <= || m <= )
{
return ;
}
if(n == m)
{
for(std::list<int>::iterator iter = la.begin();iter!=la.end();iter ++)
{
std::cout<<*iter<<"+";
}
std::cout<<n<<std::endl;
}
la.push_back(n); FindCombine(la,n,m-n);
la.pop_back(); FindCombine(la,n-,m);
}
还有另外一种解法
void FindCombine1(std::list<int> &la, int n,int m)
{ if(m < 0)
{
return ;
}
if(m == 0)
{
for(std::list<int>::iterator iter = la.begin();iter!=la.end();iter ++)
{
std::cout<<*iter<<"+";
}
cout << endl;
return ;
}
if(n <= 0)
{
return ;
} for(int i = n; i>0 ;i--)
{
la.push_back(i);
FindCombine1(la,i,m-i);
la.pop_back();
}
}
一道编程题: 在1~n之间选择若干个数,使其和为m的更多相关文章
- cpp语言程序设计教程第七章的一道编程题
题目如下 按下列要求实现一个有关学生成绩的操作. 该类名为Student. (1)每个学生的信息包含有姓名(字符数组)和成绩(int型). (2)共有5个学生,用对象数组表示. (3)计算出5个学生中 ...
- 【剑指Offer面试编程题】题目1516:调整数组顺序使奇数位于偶数前面--九度OJ
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...
- java多线程编程题之连续打印abc的几种解法
一道编程题如下: 实例化三个线程,一个线程打印a,一个打印b,一个打印c,三个线程同时执行,要求打印出6个连着的abc 题目分析: 通过题意我们可以得出,本题需要我们使用三个线程,三个线程分别会打印6 ...
- 算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。
只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/588 ...
- 今天考试的JAVA编程题
今天早上考了java, 题目感觉还不错, 共四道题,有一道定义类的没啥意思就没列出来. 这三道题目还是不错的,特别是第一道,大一上学期学linux的时候,那时还没学C语言呢,准确的来说,还不知道什么是 ...
- c++primerplus(第六版)编程题——第4章(复合类型)
声明:作者为了调试方便,每一章的程序写在一个工程文件中,每一道编程练习题新建一个独立文件,在主函数中调用,我建议同我一样的初学者可以采用这种方式,调试起来会比较方便. (具体方式参见第3章模板) 1. ...
- 算法工程师<编程题>
<编程题> 1.[Maximum Product Subarray 求最大子数组乘积] 这个求最大子数组乘积问题是由最大子数组之和问题演变而来,但是却比求最大子数组之和要复杂,因为在求和的 ...
- 头条编程题 万万没想到之抓捕孔连顺 JavaScript
[编程题] 万万没想到之抓捕孔连顺 时间限制:1秒 空间限制:131072K 我叫王大锤,是一名特工.我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺.和我一起行动的还有另外两名特工,我提议 ...
- C算法编程题(六)串的处理
前言 上一篇<C算法编程题(五)“E”的变换> 连续写了几篇有关图形输出的编程题,今天说下有关字符串的处理. 程序描述 在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求 ...
随机推荐
- SSM-SpringMVC-29:SpringMVC中InitBinder的初步
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 之前博客的配置日期类型转换器,他是全局的,如果只是一个处理器中使用怎么办? 引出@InitBinder注解 ...
- Activity的生命之路
activity的生命周期这张图是最经典的了,下面我就说一下 这张图的脉络: 第一条线我们这么走 onCreate→onStart→onResume→onPause→onStop→onDestroy ...
- 对JDK的深入理解
今天对Java的jdk有了更加深入的理解: Java的jdk其实一共包含三部分内容: 1.工具包 2.类库 3.JRE jdk的全名:Java develop kit (java开发工具) jdk包含 ...
- Ribbon负载均衡策略配置
在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接 ...
- 开机出现loading (hd0)/ntldr。。。
电脑一开机就出现ntldr is missing的原因:1.操作系统文件损坏.2.MBR表损坏.3.硬盘数据线松了.4.硬盘坏了.解决方法:1.重新安装操作系统.2.用U盘或光盘引导,进入PE系统,用 ...
- I/O-----二进制文件的读写
好吧 已经被I/O刷屏了 这是复制文件 DataInputStream dis =new DataInputStream(new FileInputStream("src/pcl.jpg ...
- Go的context的问题
Go的context的问题 2017-05-29 最近被由context引发的一个bug坑得不轻,所以反思一下Go的context的问题. context是隐式的约束,没有检测 如果我们写一个函数,比 ...
- poj 3243 扩展BSGS
每次把gcd(a,c)提到前面,直到a,c互质,然后就是普通BSGS了 #include<cstdio> #include<cstring> #include<iostr ...
- cogs 2235 烤鸡翅
贪心,每次如果够直接卖,不够找到之前的卖出的最多的一份,然后反悔 不过反悔的确是很好的策略! #include<cstdio> #include<cstring> #inclu ...
- Arrays.asList 为什么不能 add 或者 remove 而 ArrayList 可以
分析如下例子: 1 import java.util.Arrays; 2 import java.util.List; 3 4 5 public class Test { 6 public stati ...