输入 N (N 是正整数, N <= 200)
输入 N 个价格p(正整数, p <= 10000)用单空格分割
输入金额 M(M是正整数,M <= 100000 )
能组合出来输出 1
否则输出 0
6 99 199 1999 10000 39 1499 10238
1
import java.util.*;
public clas***ain{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
int sum=sc.nextInt();
if(getResult(arr,sum)){
System.out.println(1);
}else{
System.out.println(0);
}
}
}
//dp[i][j]表示arr的前i个数能否得到和j,每一个数都可以取或者不取
public static boolean getResult(int[] arr,int sum){
int n=arr.length;
boolean[][] dp=new boolean[n+1][sum+1];
dp[0][0]=true;
for(int i=1;i<=n;i++){
dp[i][0]=true;
}
for(int j=1;j<=sum;j++){
dp[0][j]=false;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=sum;j++){
dp[i][j]=dp[i-1][j];
if(j>=arr[i-1]){
dp[i][j]=dp[i][j]||dp[i-1][j-arr[i-1]];
}
}
}
return dp[n][sum];
}
}