中兴面试题之中的一个。难度系数中。

题目描写叙述例如以下:输入两个整数n 和m,从数列1,2。3.......n 中任意取几个数,

使其和等于m ,要求将当中全部的可能组合列出来。

逻辑分析:

1、比起微软,google,百度这些公司,中兴的面试题还是略显逗比的,并不是是说难度上差异,而是中兴的题目总是显得不伦不类。本题事实上就是考察数的组合,对于此类问题。通常手段都是递归,而我们的目标就在于找出递归式。

2、问题事实上本质上就是0/1背包问题,对于每个n,我们採用贪婪策略,先考察是否取n,假设取n,那么子问题就变成了find(n-1,m-n),而假设舍弃n,子问题则为find(n-1,m)。至此。我们利用DP思想找到了递归式(非常多时候。所谓动态规划,贪婪仅仅是一念之差)。

3、那么,怎样制定解的判定策略?我们知道。递归须要边界条件,而针对背包问题,边界条件仅仅有两种,假设n<1或者m<1,那么便相当于“溢出”,无法combo出m,而还有一种可能就是在剩余的n个里恰好满足m==n,即此时 背包刚好填充满。输出一组解单元。除此之外。再无其它。

C源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> int length; void findCombination(int n,int m,int *flag)
{
if(n < 1 || m < 1)
return;
if(n > m)
n = m;
if(n == m)
{
flag[n-1] = 1;
for(int i=0;i<length;i++)
{
if(flag[i] == 1)
printf("%d\t",i+1);
}
printf("\n");
flag[n-1] = 0;
}
flag[n-1] = 1;
findCombination(n-1,m-n,flag);
flag[n-1] = 0; findCombination(n-1,m,flag);
} int main()
{
int n, m;
scanf("%d%d",&n,&m);
length = n;
int *flag = (int*)malloc(sizeof(int)*length);
findCombination(n,m,flag);
free(flag);
return 0;
}

注:我们设置flag背包,用来标注相应的n+1是否被选中,1表示被选中。0则表示未选中,每当满足m==n时,则输出一组解。

程序easy产生逻辑bug的地方在于length的使用(读者能够思考一下为何须要全局变量length。而不是直接使用n来取代for循环)。

输入两个整数n 和m,从数列1,2,3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来的更多相关文章

  1. 【编程题目】输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数, 使其和等于 m ... ★

    第 21 题(数组)2010 年中兴面试题编程求解:输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来. 我的思路: 从小 ...

  2. 面试题:输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m

    问题: 2010年中兴面试题 编程求解: 输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来. 思路: 类似这种组合问题一般都是使 ...

  3. 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来

    import java.util.LinkedList; import java.util.Scanner; public class Main { private static LinkedList ...

  4. 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m

    题目:编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m.要求将所有的可能组合列出来. 分析:分治的思想.可以把问题(m,n)拆分(m - n, n -1)和(m, n ...

  5. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)

    1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 136[Submit][Status ...

  6. Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】

    D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)

    从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...

  8. c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?

    #include <iostream> using namespace std; int main(){ //求两数的和? int a,b,s; cout<<"请你输 ...

  9. JS写一个简单的程序,输入两个整数,打印这两个数的和,差,积,余数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. Sql生成不重复的数字

    -- ============================================= -- Author:TUZI -- Create date: 2016.4.18 -- Descrip ...

  2. 关于加减和es6

    console.log(1+ "2"+"2");   //对于加法来说,如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,然后将两者拼接,为122 c ...

  3. Linux系统资源监控--linux命令、nmon和spotlight

    前言: 系统资源监控一般监控系统的CPU,内存,磁盘和网络.系统分为windows和Linux.本篇主要记录Linux. Linux系统资源监控常用命令及工具 一.常用命令:top.free.iost ...

  4. UVM基础之---------uvm factory机制register

    factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...

  5. 关于使用Axis2 webservice 处理Fault响应时抛org.apache.axis2.AxisFault的分析

    使用Axis2这个框架进行webservice协议通讯,期间出了个问题,我(CLIENT)请求后,当服务端返回符合协议的SOAP异常报文,例如<soap:fault> ... 我的程序直接 ...

  6. ci框架中model简单的mysql操作

    <?php class SingerModel extends CI_Model { function SingerModel() { //会将数据库对象赋值给CI_Controller的db属 ...

  7. Hibernate框架之Criteria 详解

    自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖 ...

  8. java 23种设计模式 链接集锦

    创建型抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html工厂方法 http://www.cnblogs ...

  9. 比较常见的几种代理ip类型

    1.HTTP代理服务器 代理服务器英文全称是Proxy Server,他的功能就是代理网络用户去获得网络信息.形象点说:就是网络信息的中转站.通常情况下,网络浏览器直接去连接其他Internet站点取 ...

  10. 梦想CAD控件自定义实体实现

    一.增加自定义实体对象 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private void DrawMlineCommand( ...