输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
输出不同的选择物品的方式的数目。
3 20 20 20
3
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[] arr = new int[n]; for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(br.readLine()); int[][] memory = new int[n + 1][41]; System.out.println(recurrent(arr, 0, 40, memory)); } private static int recurrent(int[] arr, int index, int rest, int[][] memory) { // 到头了 if(index == arr.length){ if(rest != 0) return 0; // 还没凑出来 else return 1; // 凑出来了,返回一种方案 } if(rest < 0){ // 凑过头 return 0; }else if(rest == 0){ return 1; }else{ // 缓存命中,直接返回 if(memory[index][rest] != 0) return memory[index][rest]; memory[index][rest] = recurrent(arr, index + 1, rest, memory) + recurrent(arr, index + 1, rest - arr[index], memory); return memory[index][rest]; } } }
import java.util.Scanner; public class Main { static int[] record ; static int n ; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); record =new int[n]; for (int i = 0; i < n; i++) { record[i]=scanner.nextInt(); } int count = fun(0, 40); System.out.println(count); } static int fun(int i,int sum){ //结束 if (i==n) return 0; //刚好够,注意,这里还可以不填充继续递归 if (record[i]==sum) return 1+fun(i+1,sum); else if (sum>record[i]) return fun(i+1,sum-record[i])+fun(i+1,sum); //sum<record[i] return fun(i+1,sum); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); int[] items=new int[n]; int[][]dp=new int[n+1][41]; for(int i=0;i<n;i++) { items[i]=in.nextInt(); } System.out.println(kindsOfMethods(items,dp)); } //传入每个物体的体积和dp数组 public static int kindsOfMethods(int[] items,int[][] dp) { for(int i=0;i<dp.length;i++) { dp[i][0]=1; } for(int i = 1;i<dp[0].length;i++){ dp[0][i] = 0; } //遍历dp数组,为dp数组赋值 //行 for (int i=1;i<dp.length;i++) //列 { for(int j=1;j<dp[0].length;j++) { if(j>=items[i-1]) { dp[i][j]=dp[i-1][j]+dp[i-1][j-items[i-1]]; } else dp[i][j]=dp[i-1][j]; } } return dp[items.length][40];} }
import java.util.*; public class Main { public static void helper(int[] items, int n, int start, int[] cnt) { if (n == 0) { cnt[0]++; return; } for (int i = start; i < items.length; ++i) { if (n >= items[i]) { n -= items[i]; helper(items, n, i+1, cnt); n += items[i]; } } } public static void main(String[] args) { Scanner reader = new Scanner(System.in); int n = reader.nextInt(); int[] items = new int[n]; for (int i = 0; i < n; ++i) { items[i] = reader.nextInt(); } int[] cnt = new int[1]; helper(items, 40, 0, cnt); System.out.println(cnt[0]); } }