法一:递归版
package planning;
import java.util.*;
public class Pocket {
static int a[];//物体体积
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
a=new int[n+1];
for(int i=1;i<=n;i++)
a[i]=sc.nextInt();
System.out.println(Ways(40,n));
}
static int Ways(int v,int n)//从n个物体中选取若干凑体积为V
{
if(v<=0) return 1;//不选
if(n<=0) return 0;//无物体可选
return Ways(v,n-1)+Ways(v-a[n],n-1);//第n个物体可分为选/不选两种情况
}
}
法二:DP循环版
package planning;
import java.util.*;
public class Pocket2 {
static int ways[][];//ways[i][j]表示从j中选取若干凑成i的方法数
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ways=new int[40][30];
int a[]=new int[n+1];//n个物体的体积
for(int i=1;i<n;i++) {
a[i]=sc.nextInt();//第i个物体的体积
ways[0][i]=1;//V=0的方法数
}
ways[0][0]=1;//V=0的方法数
for(int v=1;v<=40;v++)
for(int k=1;k<=n;k++) {
ways[v][k]=ways[v][k-1];
if(v-a[k]>=0)
ways[v][k]+=ways[v-a[k]][k-1];
}
System.out.println(ways[40][n]);
}
}