给定随意长度的一个集合。用一个数组表示,如{"a", "b","c"},求它的全部子集。结果是{ {a}, {b}, {c}, {a,b}, {a,c}, {b,c}, {a,b,c}}和一个空集。

以下讲的就是怎样用一个原始的傻瓜方法(非算法)求它的全部子集。

首先我们知道是它的子集个数是2^length,假设长度是3,那子集就共同拥有2的3次方=8个,包含空集。

求子集,我的做法是对不论什么一项做推断,有或者无,用1和0来相应表示。

那么像这样的长度为3的,用二进制来表示就是000、001、010……

事实上就是从0-2^3,用2进制表示出来就是所以的子集了。然后把0相应的子项给拿掉。譬如010相应的就是b,011相应的就是bc。

仅仅须要从0到2^3-1做一个循环。然后把0-7之间的数用二进制表示出来,再与原集合进行对照。

把0相应位置的字符去掉,这样就得到了全部子集。

原理非常easy,以下是代码

package huisu;/*** Created by wolf on 2016/3/22.*/
public class GetSet {private String[] origin = {"a", "b", "c"};private String[] targetArray;public static void main(String[] args) {new GetSet().doJob();}private void doJob() {//获取将要分解的字符串假设转为2进制最大是几//如字符串是3位。就是2^3。

从[0 0 0]到[1 1 1] int maxLength = (int) Math.pow(2, origin.length); targetArray = new String[maxLength]; for (int i = 0; i < targetArray.length; i++) { //十进制转2进制 targetArray[i] = Integer.toBinaryString(i); } buling(); print(); } /** * 给空位补0,凑齐位数 */ private void buling() { for (int i = 0; i < targetArray.length; i++) { //位数是完整的,不须要补0 if (targetArray[i].length() == origin.length) { continue; } String temp = ""; //0,1,10,11,111 for (int j = 0; j < origin.length - targetArray[i].length(); j++) { temp += "0"; } targetArray[i] = temp + targetArray[i]; } } private void print(){ for (int i = 0; i < targetArray.length; i++) { String s = targetArray[i];//如000,001,010 for (int j = 0; j < s.length(); j++) { char item = s.charAt(j); if (item == '1') { System.out.print(origin[j]); } } System.out.println(); } } }

在第23行是将10进制的0-7转成二进制,转之后例如以下图

这里就有个问题,那就是位数并不满。像0、10之类的,将来和原始数组做相应推断的时候有点小麻烦,所以我做了个处理,把位数补齐。保持和原始数组位数一样。

调用了buling(原谅我想不起来用什么英语来表示补零)方法。把位数不足的前面全补上0.然后就变成了000,001,010……这样就能够非常方便的去推断了,仅仅打印1所在的位数即可了。參考print方法。

总结:这样的做法比較简单易懂。也能适应随意长度的求子集问题。

依据这样的做法,还能解决另外一个问题——01背包问题(有编号分别为a,b,c,d,e的五件物品。它们的重量各自是2,2,6,5,4,它们的价值各自是6,3,5,4,6。如今给你个承重为10的背包。怎样让背包里装入的物品具有最大的价值总和?)相信非常easy能看出来,上面的方法求出来了全部子集,那么对于01背包问题。就是依据全部的子集。先砍掉全部超重的子集。然后去计算剩余的子集的价值,找到最大的就OK了。

傻瓜方法求集合的全部子集问题(java版)相关推荐

  1. Java实现构建函数依赖与函数依赖集的类、求函数依赖集的闭包、属性集闭包、判断属性集是否为候选码/超码、求集合的全部子集

    求函数依赖集闭包 本文讲解具体代码实现,相关概念可查阅资料(其实我只是想把代码保存到博客上嘿嘿 这算是我第一次能够用构建一个个类来解决一个较大的问题(不再是像考试一样在一个类里写n个函数了ORZ),在 ...

  2. 求集合A的子集(图+案例)

    求集合A的子集 1.什么是子集 2.求解子集的步骤(以123为例) 2.1代码 1.什么是子集 子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集. 符号语言:若 ...

  3. 求集合的所有子集的算法

    转自:http://plutoblog.iteye.com/blog/976218 求集合的所有子集的算法 对于任意集合A,元素个数为n(空集n=0),其所有子集的个数为2^n个 如集合A={a,b, ...

  4. java set子集_Java 求集合的所有子集

    packagech01;importjava.util.HashSet;importjava.util.Iterator;importjava.util.LinkedList;importjava.u ...

  5. 图方法:寻找无向图联通子集的JAVA版本

    图像处理中一般使用稠密方法,即对图像进行像素集合进行处理.在图像拓扑方面,更多地应用图计算方法. 寻找无向图联通子集的JAVA版本,代码: //查找无向图的所有连通子集//wishchin!!!pub ...

  6. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  7. 简单工厂模式,工厂方法模式,抽象工厂模式总结-java版

    文章目录 LOG:更新日志 一.简单工厂模式,工厂方法模式,抽象工厂模式定义 二.三种工厂模式的优缺点以及适用场景 三.名词解释 四.简单工厂模式.工厂方法模式与抽象工厂模式之间的区别 五.抽象工厂模 ...

  8. 求集合的所有子集问题

    给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 示例: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[ ...

  9. 利用递归的方法求最大公约数和最小公倍数(Java)

    package Four; /** 最大公约数(Greatest Common Divisor) GCD* * 什么是最大公约数:是指两个或多个整数共有约数中,最大的一个约数* * 题目描述* 输入两 ...

最新文章

  1. 各种机器学习方法的优缺点
  2. 【Flutter】Flutter 应用主题 ( ThemeData | 动态修改主题 )
  3. 华为端到端项目管理流程_【达睿原创】供应链端到端管理 – 看华为是怎么做的...
  4. 循序渐进DB2.DBA系统管理、运维与应用案例pdf
  5. 计算机专业可以评机械工程师,机械工程师个人评价
  6. 开源社交系统java_JAVA 开源 SNS 社交系统 JEESNS V0.8 发布
  7. java五子棋判断_JAVA 五子棋 判断输赢的代码实现
  8. nginx查看配置文件nginx.conf路径
  9. 华为隐藏功能扩大内存代码大全_发现将华为手机这3个功能打开,竟然可以将手机性能极限发挥...
  10. 数据结构|-二叉查找树(二叉搜索树)的链式存储结构的实现
  11. Eigen教程(9)之Reshape,Slicing介绍
  12. myBatis之入门示例
  13. 如何选择和部署长尾关键词
  14. Java 学习笔记·十二 —— Java 案例·网上商城系统
  15. 永久消除自动产生的QQPCMgr
  16. Visual Studio 番茄助手 安装问题
  17. goLang 时间处理
  18. python bind绑定失败_Python tkinter之Bind(绑定事件)的使用示例
  19. R语言read.csv()读入行不规则数据
  20. 编译原理(第二版)张素琴 课后代码 A.2 C版本

热门文章

  1. Excel的裁剪(trimming)(トリミング)功能使用介绍
  2. bat 字符串截取操作
  3. eclipse 启动服务后,部署的文件一直是旧的文件的原因分析
  4. 刷新率调高,或高于60Hz闪屏,忽明忽暗,晃动问题
  5. 【Oracle】11g外部表指定oracle_datapump引擎,不能使用preprocessor预处理子句。
  6. 解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
  7. 当前版本的Android Gradle插件不支持按需配置
  8. Win11如何开启聚焦功能?Win11开启聚焦功能的方法
  9. window.open打开页面并传值,window. location.search遍历获取到的请求链接中的所有参数
  10. 江苏计算机云服务,云呐|江苏企业机房环境动环监控服务商系统智能监测