考研机试 59.神奇的口袋

时间:2021/03/09

一.题目描述

有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。

输入描述

输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,
每行有一个1到40之间的正整数,分别给出a1,a2……an的值。

输出描述

输出不同的选择物品的方式的数目。

题目链接

https://www.nowcoder.com/practice/9aaea0b82623466a8b29a9f1a00b5d35?

tpId=40&tqId=21390&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

二.算法

题解

使用递归求解动态规划问题。递推式dp(count, index) = dp(count, index - 1) + dp(count + weight[index], index - 1),就是一个选与不选的问题。我这里是从下标最大的地方开始的,所以递归的边界有两个,一个是下标index小于0,相当于都遍历完了,另一个是count等于40(后来想了一下,感觉只用第一个边界也可以,因为第一个边界里面也有count等于40的条件)。

代码

import java.util.Scanner;

public class Main{
    
    public static int weight[];
    
    public static void main(String[] args){
        //读取输入
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        weight = new int[n];
        for(int i = 0; i < n; i++){
            weight[i] = in.nextInt();
        }
        
        //求选择的数目
        System.out.println(dp(0, n - 1));
    }
    
    //通过递归求选择的数目
    public static int dp(int count, int index){
        if(index < 0){
            if(count == 40){
                return 1;
            }else{
                return 0;
            }
        }
        if(count == 40){
            return 1;
        }else if(count < 40){
            return dp(count, index - 1) + dp(count + weight[index], index - 1);
        }else{
            return 0;
        }
    }
}
努力,向上,自律
原文地址:https://www.cnblogs.com/machi12/p/14503602.html