题目描述
有 n 个物品可供选择,必须选择其中 m 个物品,请按字典序顺序输出所有选取方案的物品编号
123 与 132 与 132 等被认为是同一种方案,输出字典序最小的 123 即可
输入:
对于每一组测试数据, 每行输入2个数n和m
1<=m<=n<=10
输出:
对于每组输入样例,按字典序输出所有方案选择物品的编号,每种方案占一行
示例1:
输入: 4 1
输出:
1
2
3
4
示例2:
输入: 5 2
输出:
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
解题思路
本题本质就是概率论中的选择问题!由于所有方案都需要列举,那么就只能穷举法了!
本题的难点不在思路,而在于代码实现上!小白这里采用递归加循环的方式实现,每层递归仅固定需要输出列表的某一个值,而这个值取值又是在某个范围内取值,因此用到循环。
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(), m = in.nextInt();
int[] res = new int[m];
fun(res, 0, 1, m, n);
}
/**
* @param res 结果列表
* @param index 固定值下标
* @param start 固定值起始值
* @param m m
* @param n n
*/
private static void fun(int[] res, int index, int start, int m, int n) {
if (index == m) {
for (index = 0; index < m; index++) {
System.out.printf("" + res[index]);
if (index != m - 1) {
System.out.printf(" ");
}
}
System.out.println();
return;
}
//固定值在区间[start,n-(m-index)+1]变化
for (int val = start; val <= n - (m - index) + 1; val++) {
res[index] = val;
fun(res, index + 1, val + 1, m, n);
}
}
}
\