参考: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
2083

被折叠的 条评论
为什么被折叠?



