给定 n 个数,选出若干个,判断是否可以使它们的和恰好为 k 。
import java.util.*;
public class Main{
public static int maxn = 100;
public static int n,K,flag=0;
public static int[] a = new int[maxn+10];
public static int[][] dp = new int[maxn+10][maxn+10];
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
for(int i=0;i<n;i++){
a[i] = scanner.nextInt();
}
K = scanner.nextInt();
dp[0][0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<=K;j++){
for(int k=0;k<=1&&k*a[i]<=j;k++){
dp[i+1][j] |= dp[i][j-k*a[i]];
}
}
}
if(dp[n][K]==1){
System.out.println("Yes");
}
else{
System.out.println("Yes");
}
}
}
/*
4
1 2 4 7
13
Yes
*/
笔记:
如果每个数a[i]都有m[i]个可选,那么就把循环代码改为
for(int i=0;i<n;i++){
for(int j=0;j<=K;j++){
for(int k=0;k<=m[i]&&k*a[i]<=j;k++){
dp[i+1][j] |= dp[i][j-k*a[i]];
}
}
}