子集生成(增量构造法、位向量法)
一、增量构造法
给定n个数字,枚举出所有可能的子集
例如给定n=3,枚举出{1,2,3}所有可能的子集
{1}、{2}、{3}、{1,2}、{1,2,3}、{2,3}
文章图片
image.png 【子集生成(增量构造法、位向量法)】以下是java实现
public class sublist {
public static void subset(int n, int A[], int cur) {
for (int i = 0;
i < cur;
i++)
System.out.printf("%d", A[i]);
//打印当前集合
System.out.println();
int s;
if (cur != 0) //如果cur=0,则从1开始,cur!=0,从A[cur - 1] + 1开始,由于数组坐标性质决定的
s = A[cur - 1] + 1;
else
s = 1;
for (int i = s;
i <= n;
i++) {
A[cur] = i;
subset(n, A, cur + 1);
//递归构造子集
}}public static void main(String[] args) {
int n = 4;
int A[] = new int [n];
sublist.subset(n, A, 0);
}}
二、位向量法
构造一个位向量,只有当B[i] = 1时才打印该处位置的i值+1

文章图片
image.png
public class sublistB {public static void sublist(int n, int[] B,int cur) {
if(cur == n) {
for(int i = 0;
i < n;
i++)
if(B[i] > 0)
System.out.print(i+1+" ");
//打印当前集合
System.out.println();
return;
}B[cur] = 1;
//选第cur个元素
sublist(n,B,cur+1);
B[cur] = 0;
//不选第cur个元素
sublist(n,B,cur+1);
}public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] B = new int[n];
sublistB.sublist(n, B, 0);
}}
推荐阅读
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- ssh生成公钥秘钥
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- Java代码辅助效率工具Lombok(注解|Java代码辅助效率工具Lombok(注解,自动生成代码)
- python|python random使用方法
- 单片机|keil把源代码生成lib的方法
- 小程序|【自制壁纸生成器】2022新年壁纸领取,换一张手机壁纸,迎接2022叭~
- Python【习题】(随机生成激活码、优惠码、验证码)