输入 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]; } }