n个各不相同的元素中取出m个有序数

参考:https://blog.csdn.net/zyx_ly/article/details/106558014

 

从1,2,3,,,n中取出m个不同的有序数

题解:
1. 题解一:(正向打印)
1. 选择第i(m <=i<=n)个元素作为每个组合的最后元素,在第1————i个元素中往前(前i - 1个元素中)选取m-1个元素。
2. 若m等于1(对应b[0]),则表示选完,输出该组合(数组b中存储的是组合的元素在a中的下标)
3. 若m>1,则重复1、2步骤

例如:

从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。

如 1 2 3 4 5 中选取 3 个

1、如果不包含5、也不包含4,直接选取3,那么再在前2个里面选取2个,刚好只有两个。

2、如果只不包含5,直接选定4,那么再在前3个里面选取2个,而前3个里面选取2个又是一个子问题,递归即可。

3、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。

纵向看,1、2、3刚好是一个for循环,初值为m(m == 3),终值为n(n == 5)

横向看,该问题为一个前i-1个中选m-1的递归。
 

import java.util.*;

public class Main {

    public static void C(int n, int m, int a[], int b[])
    {
        for(int i = m; i <= n; i++)
        {
            b[m - 1] = i - 1;
            if(m > 1)
            {
                C(i - 1, m - 1, a, b);
            }
            else
            {
                for(int j = 0; j < b.length; j++)
                {
                    System.out.printf("%d ", a[b[j]]);
                }
                System.out.println();
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 4
        int m = sc.nextInt(); // 2
        int a[] = new int[n];
        for(int i = 0; i < n; i++)
        {
            a[i] = i + 1; // a[0, 1, 2, 3] = { 1, 2, 3, 4};
        }
        int b[] = new int[m]; // 数组b中存储的是组合的元素在a中的下标
        C(n, m, a, b);
        sc.close();
    }
    
}

// // 输入:
// 4 2

// // 输出:
// 12
// 13
// 23
// 14
// 24
// 34

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值