算法偶记:子集组合(给定一个元素个数为N的集合(其中元素互不相同),在其中选择M个元素组成子集,共有多少种选法。举例:输入[A,B,C] ,M=2,输出[[A,B],[A,C],[B,C]])

给定正整数n和m,计算出n个元素的集合{1,2,...,n}可以划分为多少个不同的由m个元素组成的子集合 给定正整数n和m,计算出n个元素的集合{1,2,...,n}可以划分为多少个不同的由m个元素组成的子集合 shou'xia 阅读详情

1.  给定一个元素个数为N的集合(其中元素互不相同),在其中选择M个元素组成子集,共有多少种选法。举例:输入[A,B,C] ,M=2,输出[[A,B],[A,C],[B,C]]

算法2.0

 public static void main(String[] args) {
        ArrayList resultList = new ArrayList();
        method2(Arrays.asList(1, 2, 3, 4, 5, 6, 7), null, resultList, 1, 0);
        System.out.println(resultList);

        resultList = new ArrayList();
        method2(Arrays.asList(1, 2, 3, 4, 5, 6, 7), null, resultList, 2, 0);
        System.out.println(resultList);

        resultList = new ArrayList();
        method2(Arrays.asList(1, 2, 3, 4, 5, 6, 7), null, resultList, 3, 0);
        System.out.println(resultList);

        resultList = new ArrayList();
        method2(Arrays.asList(1, 2, 3, 4, 5, 6, 7), null, resultList, 4, 0);
        System.out.println(resultList);

        resultList = new ArrayList();
        method2(Arrays.asList(1, 2, 3, 4, 5, 6, 7), null, resultList, 5, 0);
        System.out.println(resultList);

        resultList = new ArrayList();
        method2(Arrays.asList(1, 2, 3, 4, 5, 6, 7), null, resultList, 6, 0);
        System.out.println(resultList);

        resultList = new ArrayList();
        method2(Arrays.asList(1, 2, 3, 4, 5, 6, 7), null, resultList, 7, 0);
        System.out.println(resultList);
    }

    /**
     * @param argsList   参数
     * @param valueList  上一级的值
     * @param resultList 结果集
     * @param m          结果集目标长度
     * @param start      开始索引
     */
    public static void method2(List argsList, List valueList, List<List> resultList, int m, int start) {
        for (int i = start; i < argsList.size(); i++) {
            List list = new ArrayList();
            if (null != valueList) {
                list.addAll(valueList);
            }
            list.add(argsList.get(i));
            if (list.size() == m) {
                resultList.add(list);
                continue;
            }
            method2(argsList, list, resultList, m, ++start);
        }
    }

算法1.0:(错误的)(感谢读客唯丶丶丶:指出)

public static void main(String[] args) {
        System.out.println(method(Arrays.asList(1, 2, 3, 4, 5, 6, 7), 1));
        System.out.println(method(Arrays.asList(1, 2, 3, 4, 5, 6, 7), 2));
        System.out.println(method(Arrays.asList(1, 2, 3, 4, 5, 6, 7), 3));
        System.out.println(method(Arrays.asList(1, 2, 3, 4, 5, 6, 7), 4));
        System.out.println(method(Arrays.asList(1, 2, 3, 4, 5, 6, 7), 5));
        System.out.println(method(Arrays.asList(1, 2, 3, 4, 5, 6, 7), 6));
        System.out.println(method(Arrays.asList(1, 2, 3, 4, 5, 6, 7), 7));
    }

    public static List<List> method(List argsList, int m) {
        List result = new ArrayList<>();
        for (int i = 0; i < argsList.size(); i++) {
            List arg = new ArrayList<>();
            arg.add(argsList.get(i));
            if (m == 1) {
                // 如果只有1个数字的组合
                result.add(arg);
                continue;
            }
            // j是 第二位数的索引
            int j = i + 1;
            // count 是圈数
            int count = 0;
            // argsList.size() - j + 1 >= m  主要是判断后面的数字还需不需要循环
            // 例子:1 2 3 4 如果我是需要3个数的组合,那你的循环是不会到3的,因为3后面只有4,最多是2个数的组合,只会到2,2后面有3和4,才能符合3个数的组合
            while (argsList.size() - j + 1 >= m) {
                arg = new ArrayList<>();
                arg.add(argsList.get(i));
                int max = i;
                for (int l = 0; arg.size() < m - 1; l++) {
                    // 这里的作用主要是获取最后一位数之前的全部数
                    // 例子 1 2 3 4 5 , 4位数的组合, 我的想法是 先获取 1 2 3 公共的前缀,然后 遍历4和5
                    arg.add(argsList.get(j + l));
                    max = j + l;
                }
                // k 是最后一位数的索引
                int k = max + count + 1;
                while (arg.size() != m) {
                    // 这里就是为了遍历最后一个数字
                    arg.add(argsList.get(k++));
                }
                result.add(arg);
                if (k == argsList.size()) {
                    // 当k等于最后一位数时,说明 已经遍历完了,第二位数字需要跳到下一位,
                    // 例子 1 2 3 4 ,3位数组合,当k等于索引3的时候,说明 123, 124都遍历完了,需要跳到 13开头
                    j++;
                    count = 0;
                    if (m == 2) {
                        break;
                    }
                    continue;
                }
                // 圈数累加
                count++;
            }
        }
        return result;
    }

SAP数据导入工具(LSMW) 超级详细教程(批量导入内部订单) 用户提了个需求,让我批量导入内部订单几百个内部订单。我本打算用写段ABAP 代码来调用 BAPI (BAPI_INTERNALORDER_CREATE)就可以了。但想到我很久没有用过LSMW 了,都快要忘记了。于是我采用LSMW的方式,完成了任务。并把过程记录下来,形成教程方便我以后回头查看,分享出来也希望对大家有帮助。 阅读详情

相关推荐

【ECCV 2024】动态范围直方图自注意力DHSA,即插即用!

直方图自注意力机制,将空间特征按强度分段并进行分组,然后在各个分组内或分组间应用自注意力,以选择性地关注具有动态范围的空间特征,并处理长距离内相似退化的像素。

qq_43303160的博客 1844

【分治算法】

分治算法 A Problem A. 集合划分 时间限制 1000 ms 内存限制 64 MB 题目描述 n个元素的集合{1,2,…, n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下: 略,md会报错 给定正整数n,计算出n 个元素的集合{1,2,…, n }可以划分为多少个不同的非空子集。 输入数据 多组输入(<=10组数据,读入以EOF结尾) 每组一行输入一个数字,n(0<n<=18) 输出数据 每组输出一行结果。 样例输入

aosiweixin的博客 3987

Playwright Java环境配置避坑指南:浏览器路径、类加载与离线部署

Playwright作为现代端到端测试框架,其Java SDK突破了传统Selenium的Driver管理模式,将Chromium/Firefox/WebKit内核视为可编程运行时资源。其核心原理在于SDK与浏览器二进制分离——Maven仅管理Java字节码,而浏览器需独立下载、校验与沙箱加载。这一设计带来显著技术价值:跨平台一致性、进程隔离安全性及多浏览器并行能力;典型应用场景涵盖Spring Boot集成测试、金融级离线CI/CD、Kubernetes容器化部署及Air-Gapped封闭环境。然而,因J

weixin_32956805的博客 675

集合划分问题

集合划分问题 给定正整数n和m,计算出n个元素的集合{1,2…n}可以划分为多少个不同的由m个非空子集组成的集合。 数据输入: 由文件input.txt提供输入数据. 文件的第1行是元素个数n和非空子集数m. 结果输出: 程序运行结束时,将计算出的不同的由m个非空子集组成的集台数输出到文件output.txt中。 输入文件示例 4 3 输出文件示例 6 思路: 对于n个元素的集合,可以...

weixin_45738232的博客 1057

数字图像处理第九章笔记

目录一、腐蚀与膨胀1、腐蚀2、膨胀3、对偶性4、开操作与闭操作二、一些基本的形态学算法1、边界提取2、孔洞填充3、连通分量提取4、凸壳5、细化6、粗化7、骨架8、形态学重建三、灰度级形态学1、腐蚀和膨胀2、开运算和闭运算3、灰度级形态学算法 一、腐蚀与膨胀 1、腐蚀 腐蚀可以去除图像的某些部分。 2、膨胀 膨胀可以连接裂缝。 3、对偶性 膨胀和腐蚀彼此关于集合求补运算和反射运算是对偶的 4、开操作与闭操作 开操作:B对A先腐蚀,再进行膨胀 可以平滑物体轮廓,断开较窄的狭颈并消除较细的突出物。 闭操作

方悔读书迟 1373

Rockchip RK3568实战:手把手教你调试I2S音频驱动(附ALSA设备树配置详解)

本文提供Rockchip RK3568平台I2S音频驱动的实战调试指南。详细解析了从硬件连接到软件配置的全过程,重点涵盖ALSA驱动框架下的设备树配置、时钟计算、DMA参数设置以及常见问题(如无声、爆音)的排查与解决方法,帮助开发者快速定位并解决音频驱动难题。

weixin_28358083的博客 495

求一个集合的所有子集(c语言)

如果一个集合的元素个数为n,则每个元素都有存在或不存在两种情况,n个元素一共2^n种情况,因此元素个数为n的集合一共有2的n次方个子集。 算法1: 利用二进制的思想 如 0110 1001,0表示该数组位置不选,1表示选中。加入数组为[1,2,3,4] 0110就表示[2,3] 1001表示[1,4] 例如:求arr[4]={1,2,3,4}的所有子集 用for(i=0;i<16;i++)遍历这16种情况,每一个i的值,例如i=3,则二进制数为0011,我们从右边往左遍历(最右边为低位0),即001

weixin_43827397的博客 9436

概率数据关联(PDA):多目标跟踪的基石算法

1. 为什么需要概率数据关联? 2. 核心思想与假设条件 3. 算法核心:概率分配与状态更新 4. 典型应用场景与优势 5. 挑战与改进方向 6. 下期预告

qq_44965657的博客 1462

N个元素集合的M子集问题

一、问题描述 一根有n个元素的集合,求该集合所有m个元素的子集 二、解法 1、递归模式 每个元素要么在子集,要么不在。 /*** nums 集合* m 子集大小* idx 标记集合的第idx号元素是否进行了选择* rst 结果集* item 临时集*/private void select(int[] nums, int m, int idx, Set> rst, List it

yiduyangyi的专栏 2351

Microsoft Defender防病毒扫描添加排除项

Win10与Win11上的“**Microsoft Defender防病毒**”功能默认会自动扫描所有非压缩文件,如果发现病毒或疑似病毒甚至经过手动修改后某些安装文件,会自动将其删除,如果是后面两种情况,则可能会造成误报,对我们正常办公或学习造成不利影响。 此时, 我们可以将某个目录或文件设置为“**Microsoft Defender防病毒不会扫描已排除的项目**”(<red>但要注意:这些被排除的目录或文件会给笔记本造成一定的安全风险,如果真有病毒感染这些目录或文件它们也不会被“**Micr

weixin_42148668的博客 6480

量化交易——量化选股(多因子选股)

就是用过去的股票的收益率对多因子进行回归,得到一个回归方程,然后再把最新的因子值代入回归方程得到一个对未来股票收益的预判,然后再以此为依据进行选股。的方法是建立在市场无效或弱有效的前提之下,随着使用多因子选股模型的投资者数量的不断增加,有的因子会逐渐失效,而。就是根据各个因子的大小对股票进行打分,然后按照一定的权重加权得到一个总分,根据总分再对股票进行筛选。另一方面,一些因子可能在过去的市场环境下比较有效,而随着市场风格的改变,这些。波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的。

jiucaixiuyang的博客 1784

jzoj 3057. 【NOIP2012模拟10.26】电影票

Description 笨笨当了很久的道路调度员,笨笨也开始想体验生活,从生活中发现数学问题,锻炼自己思维。最近《变形金刚3》,《哈利波特7》同步放映,明显是决战雌雄,已知王府井中一共有n人买了《变形金刚3》的票,m人买了《哈利波特7》的票,并且n>=m,并且电影院中现在只有两种票,每次只有一个人买,(共有n+m次),这n+m次组成一个排列,为了保证每一个人买票时,《变形金刚3》票...

自以为心若顽石,却终究人非草木。 432

ECB oracle——attack

基于ECB oracle的攻击方案前言什么是ECB方案步骤1.确定块大小和明文大小2.暴力破解求明文脚本代码 前言 参考文章:Breaking ECB by prepending your own message. 环境地址:ECB oracle 什么是ECB 分组密码中AES的一种模式(其他还有:CBC、ECB、CTR、OCF、CFB)如图每一块加密是分开的。 方案步骤 1.确定块大小和明文大小 先用一个字符"a"去encrypt返回32个字节的数据(64位16进制)依次用"aa",“aaa”…去en

weixin_44617902的博客 1310

LeetCode--78. 子集(C++描述)

题目分析本题使用深度优先遍历,从树根开始向下遍历,碰到叶子节点的时候返回,最后传出栈顶的元素,然后向右子树进入,继续遍历,直到遍历完所有的子集可能。给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。输出[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]解集不能包含重复的子集。你可以按任意顺序返回解集。输入nums=[1,2,3]nums中的所有元素互不相同。输入nums=[0]输出[[],[0]]...

YGQ_qq_1435471912 341

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LeetCode 热题 HOT 100 第33天:“子集”

继续刷LeetCode 热题 HOT 100 的题目,并且在博客更新我的solutions。在csdn博客中我会尽量用文字解释清楚,相关Java代码大家可以前往我的个人博客jinhuaiyu.com中查看。 题目:子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

qq_40967164的博客 201

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

2022杭电多校联赛第九场 题解

杭电9

weixin_51937688的博客 1226

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

循环队列:C语言实现划分无冲突子集

循环队列:C语言实现划分无冲突子集 问题描述 集合A如下: A={1,2,3,4,5,6,7,8,9}, 集合R中(a,b)表示a与b是冲突关系,不能放在同一子集中: R={ (2,8), (9,4), (2,9), (2,1), (2,5), (6,2), (5,9),(5,6), (5,4), (7,5), (7,6), (3,7), (6,3) }, 求一可行的子集划分,使A划分为互不相交的子集,并使子集个数尽量少。 可行的子集划分为: A1 = {1,3,4,8}, A2 = {2,7}, A3

Zzzgxz的博客 1848

全排列生成算法(一)

对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)。 递归算法 这里以A{a,b,c}为例,来说明全排列的生成方法,对于这个集合,其包含3个元素,所有的排列情况有3!=6种,对于每一种排列,其第一个元素有3种选择a,b,c,对于第一个元素为a的排列,其第二个元素有2种选择b,c;第一个元素为b的排列,第二个元素也有2种选择a,c,……,

joylnwang的专栏 5万+

离散数学 习题篇 —— 集合中有多少个元素

题目: 集合中元素是互异的,输入一系列整数作为一个集合中的元素,计算集合中元素的个数。 输入格式: 第一行是一个整数N(0≤N≤10 5 ​,接下来有N行,每行一个整数(范围[−10 5 ​​,10​5 ​​ ]),表示集合中的元素。 输出格式: 一个整数,表示集合中元素的个数。 输入样例: 4 2 2 1 3 输出样例: 3 题解: 首先,题目说的很明确,集合中的元素是互异的...

weixin_44941062的博客 3019

求N个元素的子集合个数

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt406 一个集合有n个元素,请问怎么算出来它的子集(包括空集和本身)是 2的n次方?   解法一: n个里面一个都没有是空集 个数1n个里面选一个,集合个数是nn个里面选二个,集合个数是n*(n-1)/2n个里面选三个,集合个数是n*(n-1)*(n-2)/(3*2*1)以此类...

weixin_34010949的博客 2934

全排列生成算法

1.什么是全排列: 我们假如有一串式子,排列组合的结果会有很多种,全排列就是按照字典序有序的将所有的排列组合的性质的陈列出来 问题可以这么描述: 对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列) 2.求解算法: 1.DFS(我们大多数人所谓的递归的方法): 我们来这么看这个问题,加入有n个数据要进行全排列,我们可以假想我们

72 73 76 89 82 84 89 81 1331

一个集合的子集个数的计算方法

假设一个集合包含n个元素,要求计算

zhanghaiyang9999的专栏 8万+

[wikioi1553]互斥的数(数学分析+散列/数学分析+二分)

题目描述Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y=P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥。 输入描述Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10...

weixin_30649859的博客 172

数字n的所有子集

描述 由键盘输入数字n(1 输入格式 一个整数n 输出格式 输出由数字1至n构成的所有子集,先按元素个数,同个数情况按字典序输出 每一个数字后,有一个空格分隔 输入样例 3 输出样例 1 2 3 1 2 1 3 2 3 1 2 3 Hint 集合元素无顺序,{1,2,3

Hello World 2063

递归实现输出n个整数的全排列和所有子集

下面是用c++实现的输出n个整数的全排列# include <iostream> #include <windows.h> using namespace std; void swap(int &a, int &b) { //交换a和b int temp = a; a = b; b = temp; } void perm(int list[], int k, int

liyongqi_的博客 1万+

含有 n 个元素的子集树问题

一、子集树 当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间称为子集树 现需打印序列(长度为n)的全部子集,将问题抽象转化为一棵二叉树. 一个序列的所有子集为2n,即可看成具有2n个叶节点的满二叉树,总结点个数为2^(n+1)-1. 需定义额外数组保存当前分支的打印信息(左分支置1,右分支置0) 每遍历完一条分支,打印当前分支序列 如上图:用数组arr={1,2,3}举例...

weixin_42708378的博客 3640
上一篇: Flutter 学习(二)执行入口|变量|常量|数据类型|运算符|流程控制|关键字
下一篇: springboot搭建java项目
97牛肉面
博客等级 码龄9年 54粉丝 75原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值