任意N个数的子集生成算法

Posted Kuro同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任意N个数的子集生成算法相关的知识,希望对你有一定的参考价值。

第一种方法:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int q[100];
int w[100];
int cmp(int a,int b)

   return a<b;

void subset(int cur,int end)

     int i;
	 for(i=0;i<cur;i++)        
          printf("%d",w[i]);
	 cout<<endl;
	 for(i=cur;i<end;i++)
	 
	     w[cur]=q[i];                //赋值
		 if(i!=0&&w[cur]<=w[cur-1])    //避免相同元素和重复
			 continue;
         subset(cur+1,end);
	 

int main()

    int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",&q[i]);
	sort(q,q+n,cmp);         // 必须先排序
	subset(0,n);
   return 0;


 

第二种方法:位向量法

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int q[100];
int vis[100];
void subset(int cur,int end)
 
    int i,j,n;
	if(cur==end)                //必须给所有向量赋值才能输出
	
		for(i=0;i<cur;i++)
		
			if(vis[i])          //向量为1则输出
				printf("%d",q[i]);
		
		cout<<endl;
		return;                  //别忘了。。。
	
	vis[cur]=1;
	subset(cur+1,end);
	vis[cur]=0;
	subset(cur+1,end);

int main()

	int end;
	scanf("%d",&end);
	for(int i=0;i<end;i++)
		scanf("%d",&q[i]);
	subset(0,end);
	return 0;


 

以上是关于任意N个数的子集生成算法的主要内容,如果未能解决你的问题,请参考以下文章

使用位生成子集

如何判断一个集合是不是是集合的真子集?

子集生成

子集生成算法

C++代码 递归算法 n个数的全排列 (是任意的,可不连续) 要求: 提示输入数的个数n 然后提示输入这n个

C语言 设计并实现一种大素数随机生成方法; 实现一种快速判定任意一个大数是不是是素数方法 跪求啊