选择物品

450 阅读1分钟

选择物品/阿里巴巴编程题(2星)-牛客网

题目描述

n 个物品可供选择,必须选择其中 m 个物品,请按字典序顺序输出所有选取方案的物品编号

123132132 等被认为是同一种方案,输出字典序最小的 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);
         }
     }
 }

\