神奇的口袋
題目詳述:神奇的口袋
思路解析
遞歸:
①物品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));
}
}