TX面试题2: 已知一个含有n个元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)

题目分析, 为了便于说明,不妨将问题简化一下:

已知一个盒子中有n个不同的球,分别标记为{a1,a2,...,an},现在需要从中取出其中任意k个球,求给出各种组合。

首先,从组合数学的角度,我们可以知道本问题是一个典型的不放回组合问题,总的个数为 c(n,k).

对于{a1,a2,...,an}中某一个元素 ai是否出现在k元子集中可以把问题分为如下两个子问题。

(1) 如果ai出现在k元子集中,那么需要在剩下的 n-1个球中选出 k-1个球

(2) 如果ai没有出现在k元子集中,那么需要在剩下的n-1个球中选出k个球

既有: c(n,k) = c(n-1,k-1) + c(n-1,k)

在有该理论的基础上,我们现在的目标就是利用递归调用,当取出的球的个数满足k,则将结果打印即可。

为了好说明,我们将本问题再次简化一下, 如果已知n元素为连续集合[1,n], 那么递归程序为:

 #include <iostream>
#include <cstdio>
using namespace std;
#define N 1000
int a[N]={}; // 用于存储选中的元素
int final_k; // 用于记录k元子集的大小 /***********************************
* combination 函数中仅使用了a数组,而没有使用辅助数组,
* 这是由于默认原始 N元集合为 {1,2,...,n}。
************************************/
void combination(int a[],int n,int k)
{
for(int i=n;i>=k;i--)
{
a[k] = i;
if(k>)
combination(a,i-,k-); // 不足final_k个元素,递归选取
else
{
for(int j=a[];j>;--j) // 取出足够多球,打印之
printf("%d ",a[j]);
printf("\n");
}
}
} int main()
{
int n,k;
printf("please input n and k: \n");
scanf("%d%d",&n,&k);
final_k =k;
combination(a,n,k);
return ;
}

如果是非连续的n个数呢,那么在combination中需要用到辅助数组了:

tips: 由于LZ我有点懒,所以在输入n个数的时候,默认是不同的数,并没有判断是否有相同的元素。如果大伙儿想去重,请自行添加!

 #include <iostream>
#include <cstdio>
using namespace std;
#define N 1000
int a[N]={}; // 原N元素集合
int b[N]={}; // 辅助数组,用于存储当前选取的元素,便于打印
int final_k; // 用于记录k元素子集是否满足 void combination(int a[],int n,int k)
{
for(int i=n;i>=k;i--) // 由于是求k元素的组合,所以默认首元素的可能按照数组中顺序有n-k种
{
b[k] = a[i]; // 将a[i] 放入到数组b中记录
if(k>) // 取出的个数不足final_k个
combination(a,i-,k-);
else // 取出足够个数的球,打印结果
{
for(int j=final_k;j>;--j)
printf("%d ",b[j]);
printf("\n");
}
}
} int main()
{
int a[N]={};
int n,k;
printf("please input n and k: \n");
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d",&a[i]); //输入n个不同的元素
final_k =k;
combination(a,n,k);
system("pause");
return ;
}

random sequence

 转载请注明出处:http://www.cnblogs.com/double-win

面试题: 已知一个含有n个不同元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)的更多相关文章

  1. java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义

    package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...

  2. 已知一个字符串S 以及长度为n的字符数组a,编写一个函数,统计a中每个字符在字符串中的出现次数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 21:04 * @description ...

  3. 已知一个正整数m,编写一个程序求m的反序数(待消化)

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/5 21:08 * @description ...

  4. 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。

    题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法 ...

  5. 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数

    #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...

  6. poj1190,DFS/已知一个等式,求另一个最小值

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.  设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱. ...

  7. 已知一个日期和天数, 求多少天后的日期(是那个超时代码的AC版)

    #include <stdio.h> #include <string.h> ; int judge_year(int x) { == || x % == && ...

  8. 已知一个数组a[N]来构造数组b[N]的有趣算法题

    给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i].在构造过程要求满足:1.不使用除法:2.O(1)空间复杂度和O(n)时间复杂度:3.除 ...

  9. <每日一题>题目30:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来

    def select_d(list,d): # list = sorted(list) sum = {} for i in list: if i+d in list: sum[i] = i+d ret ...

随机推荐

  1. C# 有关控件、自定义类事件中的委托链的获取、移除操作

    直接来代码吧,这样干脆直接,也不耽误我午休了.一切尽在源码中. public class ControlEventTool { /// <summary> /// 移除控件的某类事件, 如 ...

  2. [转] 基于C#的波形显示控件的实现

    转自 基于C#的波形显示控件的实现[附完整源码下载] 编者记: 09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的 ...

  3. 佛祖保佑、永无BUG!!!

    /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : | ...

  4. IDEA2018.2版本注册

    IntelliJ IDEA 2018.2版本注册 1.到官网下载IDEA安装文件,windows版本ideaIU-2018.2.2.exe,然后安装: 2.下载补丁包JetbrainsCrack-3. ...

  5. CentOS6上安装Flash Player

    Linux CentOS6服务器中的某个需要远程操作的项目需要使用到Adobe Flash Player组件,直接通过YUM方式安装不了,于是通过强大的搜索,还是可以解决到安装方法的,通过重新加载安装 ...

  6. 简单HttpClientUtils工具类

    package com.zy.utils; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import o ...

  7. 关于使用PL/SQL连接本地oracle时报错:ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决

    转自:https://blog.csdn.net/a657281084/article/details/49490069 问题:Oracle主服务和监听器服务已经启动,使用SQL Plus能够正常连接 ...

  8. iOS判断字母、数字串

    以下为NSString类的扩展方法,分别是判断字符串是否只是包含字母.是否只包含数字.是否只包含字母和数字: //字母 - (BOOL)cdm_isOnlyLetters { NSCharacterS ...

  9. Redhat Cluster Suite原理介绍

      RedHat Cluster Suite简称RHCS,是一个能够提供高可用性.高可靠性.负载均衡.存储共享且经济廉价的集群工具集合,基于RHCS可以搭建高可用性集群.负载均衡集群.存储集群和高性能 ...

  10. Linux的kickstart安装详解

    Linux的kickstart安装详解 一.什么是kickstart? kickstart安装是redhat开创的按照你设计好的方式全自动安装系统的方式.安装方式可以分为光盘.硬盘.和网络.此文将以网 ...