編程題_排列組合問題

神奇的口袋

題目詳述:神奇的口袋

思路解析

遞歸:

①物品n個,物品體積逐一放入a[100]中

②遞歸函數count(i,sum)=count(i+1,sum-a[i])+count(i+1,sum);
其中,i爲第i個物品,sum代表剩餘空缺體積數

  • count(i+1,sum-a[i]) 代表從第i+1個物品開始,剩餘體積數爲sum-a[i]的方案數
    (隱含意思:已經將a[i]的體積計算進去,即包含a[i]的體積)
  • count(i+1,sum) 代表從第i+1個物品開始,剩餘體積數爲sum的方案數
    (隱含意思:不將a[i]的體積計算進去,即不包含a[i]的體積)

程序測試

import java.util.Scanner;

public class Main {
    private static int[] array= new int[20]; // 題目上已說明(1 <= n <= 20)
    private static int n; 
    
    private static int count(int i,int sum) {
        if(sum==0){
            return 1; //找到一組和爲sum的組合數;
        }
        if(i==n||sum<0) {
            return 0;//i==n說明沒有其他的數來組合,sum<0說明組合不出;
        }
        return count(i+1,sum-array[i])+count(i+1,sum);
        //從數組的第i爲開始,包含a[i] 和 不包含a[i];
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        len = sc.nextInt();
        for(int i = 0; i<n; i++){
            array[i] = sc.nextInt();
        }
        System.out.println(count(0,40));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章