• 考研机试 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;
            }
        }
    }
    努力,向上,自律
  • 相关阅读:
    Tarjan 算法 自学整理
    POJ 2395 Out of Hay
    Codevs 1557 热浪
    Codevs 2956 排队问题
    Codevs 1005 生日礼物
    集合
    奇怪的函数
    关押罪犯
    搭积木
    大数据
  • 原文地址:https://www.cnblogs.com/machi12/p/14503602.html
Copyright © 2020-2023  润新知