牛客网 链接:https://www.nowcoder.com/questionTerminal/9aaea0b82623466a8b29a9f1a00b5d35
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
输入描述: 输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
输出描述: 输出不同的选择物品的方式的数目。
示例1 输入
3
20
20
20输出
3
本题主要考察递归的思想:
选择物品方式无非就是两种:选和不选,
n表示物品件数,s表示可放物品体积
主要分两种情况:选或不选。
分析的详细情况如下代码:
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner input = new Scanner(System.in);
while(input.hasNext()){
int n = input.nextInt();
int[] weight = new int[n+1];
//设置数组大小多1,第一个元素为0,从第二个元素为输入的数,为了防止递归时溢出
for(int i=1;i<=n;i++){
weight[i] = input.nextInt();
}
System.out.println(count(weight,n,40));
}
}
//n表示物品件数,s表示可放物品体积
public static int count(int[] weight,int n,int s){
if(s==0){//口袋容量为0,说明装满了
return 1;
}else if(n==1){
if(weight[n]==s){//剩下一件物品刚好放满 +1
return 1;
}else{//剩下的一件物品放不下
return 0;
}
}else if(weight[n] >s){//如果这件物品体积大于口袋的体积,就不放入
return count(weight,n-1,s);
}else{
return count(weight,n-1,s-weight[n-1])+count(weight,n-1,s);
}
}
}