【牛客网OJ题】神奇的口袋

    xiaoxiao2024-11-16  68

    题目描述:

    有一个神奇的口袋,总的容积是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); } }

     

    最新回复(0)