輸入兩個整數n和m,從0-n中隨意取幾個數,使其和等於m

編程求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。實際上就是一個揹包問題。
求解思路:
1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m;
2.將最大數n加入且n == m,則滿足條件,輸出;
3.將n分兩種情況求解,
(1)n沒有加入,取n = n - 1; m = m;遞歸下去;

(2)n加入,取n = n - 1, m = m - n,遞歸下去

import java.util.*;

public class 組合數 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();//n
            int sum = scanner.nextInt();//m
            findSum(sum, n);
            System.out.println(res);
            //System.out.println(count);
            //count = 0; //求符合條件的個數
            res = new ArrayList<>();//重置res list
        }
    }

    private static List<Integer> list = new ArrayList<>();
    private static List<List<Integer>> res = new ArrayList<>();
    // private static int count = 0;//求個數

    public static void findSum(int sum, int n) {
        if (n < 1 || sum < 1)
            return;
        if (sum <= n) {//注意是小於等於
            list.add(sum); //  sum < n ,直接加入sum可以滿足了
            res.add(new LinkedList<>(list));
            list.remove(list.size() - 1);
            // count++;//求個數
            return;
        }
        list.add(n);
        findSum(sum - n, n - 1);// n加入,取n=n-1,sum=sum-n
        list.remove(list.size() - 1);
        findSum(sum, n - 1);    // n沒有加入,取n=n-1,sum=sum
    }
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章