考研机试 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; } } }
努力,向上,自律