输入两个整数n 和m,从数列1,2,3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来
中兴面试题之中的一个。难度系数中。
题目描写叙述例如以下:输入两个整数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 ,要求将当中全部的可能组合列出来的更多相关文章
- 【编程题目】输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数, 使其和等于 m ... ★
第 21 题(数组)2010 年中兴面试题编程求解:输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来. 我的思路: 从小 ...
- 面试题:输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m
问题: 2010年中兴面试题 编程求解: 输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来. 思路: 类似这种组合问题一般都是使 ...
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来
import java.util.LinkedList; import java.util.Scanner; public class Main { private static LinkedList ...
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m
题目:编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m.要求将所有的可能组合列出来. 分析:分治的思想.可以把问题(m,n)拆分(m - n, n -1)和(m, n ...
- ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)
1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 177 Solved: 136[Submit][Status ...
- 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 ...
- 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)
从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...
- c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?
#include <iostream> using namespace std; int main(){ //求两数的和? int a,b,s; cout<<"请你输 ...
- JS写一个简单的程序,输入两个整数,打印这两个数的和,差,积,余数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- Sql生成不重复的数字
-- ============================================= -- Author:TUZI -- Create date: 2016.4.18 -- Descrip ...
- 关于加减和es6
console.log(1+ "2"+"2"); //对于加法来说,如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,然后将两者拼接,为122 c ...
- Linux系统资源监控--linux命令、nmon和spotlight
前言: 系统资源监控一般监控系统的CPU,内存,磁盘和网络.系统分为windows和Linux.本篇主要记录Linux. Linux系统资源监控常用命令及工具 一.常用命令:top.free.iost ...
- UVM基础之---------uvm factory机制register
factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...
- 关于使用Axis2 webservice 处理Fault响应时抛org.apache.axis2.AxisFault的分析
使用Axis2这个框架进行webservice协议通讯,期间出了个问题,我(CLIENT)请求后,当服务端返回符合协议的SOAP异常报文,例如<soap:fault> ... 我的程序直接 ...
- ci框架中model简单的mysql操作
<?php class SingerModel extends CI_Model { function SingerModel() { //会将数据库对象赋值给CI_Controller的db属 ...
- Hibernate框架之Criteria 详解
自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖 ...
- java 23种设计模式 链接集锦
创建型抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html工厂方法 http://www.cnblogs ...
- 比较常见的几种代理ip类型
1.HTTP代理服务器 代理服务器英文全称是Proxy Server,他的功能就是代理网络用户去获得网络信息.形象点说:就是网络信息的中转站.通常情况下,网络浏览器直接去连接其他Internet站点取 ...
- 梦想CAD控件自定义实体实现
一.增加自定义实体对象 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private void DrawMlineCommand( ...