有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是 40,John现在有n个想要得到的物品,每个物品的体积分别是a1 , 2 ....an, Jonn可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋, John就可以得到这些物品。现在的问题是, John有多少种不同的选择物品的方式。
输入的第一行是正整数n (1 <= n <= 20) ,表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出2a., .an的值。
输出不同的选择物品的方式的数目。
示例1:
3
20
20
20
3
采用递归的方式
把物品体积数组a[30]设为全局变量;
count(k,sum)表示从数组的第k个数开始往前统计的组合数和为sum的种类数,
sum为组合数的和,则:cout(k,sum)=cout(k-1,sum-a[k])+cout(k-1,sum),
其中cout(k-1,sum-a[k])表示包含了a[k],即为从第k-1个数开始往前统计
组合数的和为sum-a[k]的种类数, 而cout(k-1,sum)表示不包含a[k], 即为从第k-1个数开始往前统计组合数的和为sum的种类数。
import java.util.Scanner; public class Main { static int[] a = new int[30]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i = 1;i<= n ; i++){ a[i] = sc.nextInt(); } System.out.println(count(n,40)); } public static int count(int k , int sum){ if(sum == 0){ return 1; //找到一组和为sum的组合数 } if(k<=0){ return 0; } return count(k-1,sum-a[k])+count(k-1,sum); } }