数据结构与算法面试题80道(21)

输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,

使其和等于 m ,要求将其中所有的可能组合列出来

//问题的本质是01背包,背包恰好装满。
//由于有多组解,一般用递归求解
//对于每一个n(n可以从n到1)
//如果取n,那么子问题就变成了find(n-1,m-n);
//如果不取n,那么子问题就变成了find(n-1,m);

#include<stdio.h>

int length;//由于函数中不好计算flag的长度,我们将它设为全局变量

void  findCom(int n,int m,int *flag){
    if(n<1||m<1) return;//边界,题意中最小的数是1
    if(n>m) n=m;//剪枝,大于m的数不用考虑

    if(n==m){
        flag[n-1]=1;//将最后一个数标记为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;
    findCom(n-1,m-n,flag);//要n

    flag[n-1]=0;
    findCom(n-1,m,flag);//不要n
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    length=n;//函数中的n是变化的,所以length要放在main中求
    int flag[length];//标记数组
    findCom(n,m,flag);
    return 0;
}
时间: 2024-08-10 15:11:36

数据结构与算法面试题80道(21)的相关文章

数据结构与算法面试题80道

由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之人识破,付出代价. 所以,作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July出处. 向你的厚道致敬.谢谢. ------------------------------------------------------------------------------

数据结构与算法面试题80道(28)

28.整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 这是一道很基本的考查位运算的面试题. 包括微软在内的很多公司都曾采用过这道题. #include<iostream> #include<stdio.h> using namespace std; int howMachOne(int n){ int count=0; while(n){ if(n&1) count

数据结构与算法面试题80道(30)

30.在从1到n的正数中1出现的次数 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:这是一道广为流传的google面试题. 最优美的算法就是按位进行分析 我们以21034来分析 如果将个位设为1,只考虑个位数上面的1,会有多少个1.(从1031->1021->1011->...->0001) 104个数包含104个1 如果将十位设为1,只考虑十位数上面的1,会

数据结构与算法面试题80道(23)

第23题(算法):用最简单,最快速的方法计算出下面这个圆形是否和正方形相交."  3D坐标系 原点(0.0,0.0,0.0)圆形:半径r = 3.0圆心o = (*.*, 0.0, *.*)正方形:4个角坐标;  1:(*.*, 0.0, *.*)2:(*.*, 0.0, *.*)3:(*.*, 0.0, *.*)4:(*.*, 0.0, *.*) 没搞懂坐标给的是什么意思,*.*表示坐标的值? 也不清楚圆和正方形是不是实心.如果是实心,那么内含也是相交.如果是空心,内含就是不相交. 单单说说圆

数据结构与算法面试题80道(11)

11.求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离. 错误思想:分别找左右子树到根的最深结点,相加. 错误原因:左子树上的左右子树到根的最深结点相加大于根节点左右子树到根的最深结点相加 正确思想:用动态规划来记录结点左右孩子的最大距离. 正确原因:从错误原因可以知道,最大距离为某一结点到它左右孩子的最大距离和 解题方法:(1)某一结点,左

数据结构与算法面试题80道(3)

3.求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 .要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18. //从第一个数开始加,和记为sum,用一个变量max记录最大和,如果和小于0,sum=0,扫描整个数组. #include<iostream> #inclu

数据结构与算法面试题80道(10)

第10题 翻转句子中单词的顺序. 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空 符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“student. a am I”. 思路:首先将整个句子按字符翻转,然后将句子的每个单词按字符翻转 #include<cstring> #include<iostream> using namespace std; //交换字母 void swap_word(c

数据结构与算法面试题80道(9)

第9题 判断整数序列是不是二元查找树的后序遍历结果 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6    10 / \ / \ 5 7 9 11 因此返回true. 如果输入7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回false. 开始把题看错了,打算建一颗二叉树,后续遍历,然后比较... 后来发现原来是判断一个数组

数据结构与算法面试题80道(7)

第7题 微软亚院之编程 判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交. 为了简化问题,我们假设俩个链表均不带环. 问题扩展: 1.如果链表可能有环列? 2.如果需要求出俩个链表相交的第一个节点列? 思路: 判断两个链表是否相交,并且求第一个节点列(无环). 利用计数 如果两个链表相交,两个链表就会有共同的结点列:统计链表的长度,求两个链表长度差(目的是将两个链表变成到末尾长度相同的两个链表,相交部分一定在里面),然后往后遍历,找到相等的结点,就是第一个结