2017校招真题 求和-回溯法
题目描述
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
输入描述:
每个测试输入包含2个整数,n和m
输出描述:
按每个组合的字典序排列输出,每行输出一种组合
示例1
输入
5 5
输出
1 4 2 3 5
- import java.util.ArrayList;
- import java.util.Scanner;
- /**
- * 题目描述 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 输入描述:
- * 每个测试输入包含2个整数,n和m 输出描述: 按每个组合的字典序排列输出,每行输出一种组合 示例1 输入
- *
- * 5 5 输出
- *
- * 1 4 2 3 5
- *
- * @author Administrator
- *
- */
- public class Main {
- public static ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();
- public static ArrayList<Integer> currentList;
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- while (scanner.hasNext()) {
- int n = scanner.nextInt();
- int m = scanner.nextInt();
- arrayList.clear();
- currentList = new ArrayList<>();
- func(1, n, m);
- for (ArrayList<Integer> l : arrayList) {
- int i = 0;
- for (; i < l.size() - 1; i++) {
- System.out.print(l.get(i) + " ");
- }
- System.out.println(l.get(i));
- }
- }
- }
- private static void func(int low, int n, int m) {
- if (m == 0) {
- arrayList.add(new ArrayList<>(currentList));
- }
- for (int i = low; i <= n && i <= m; i++) {
- currentList.add(i);
- func(i + 1, n, m - i);
- currentList.remove(currentList.size() - 1);
- }
- }
- }
posted on 2017-08-18 09:32 WenjieWangFlyToWorld 阅读(91) 评论(0) 编辑 收藏 举报