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

2023-05-13,,

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个元素的子集(不允许有重复的)的相关教程结束。

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

下载本文的Word格式文档,以方便收藏与打印。