CCF 202209-2 何以包邮
滚动数组
package ccf;
import java.util.*;
public class c_202209_2滚动数组 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int x = scanner.nextInt();
int[] a = new int[n];
int sum1 = 0;
for(int i = 0;i < n;i++) {
a[i] = scanner.nextInt();
sum1 += a[i];
}
if(n == 0) {
return;
}
int[] arr = new int[sum1+1];
for(int i = 0;i< n;i++) {
for(int j=sum1; j >=a[i];j--) {
arr[j] = Math.max(arr[j], arr[j-a[i]] + a[i]);
}
}
for(int i=x;i<sum1+1;i++) {
if(arr[i]>=x) {
System.out.println(arr[i]);
break;
}
}
}
}
动态规划
package ccf;
import java.util.Scanner;
public class c_202209_2动态规划 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int x = scanner.nextInt();
int[] a = new int[n+1];
int sum1 = 0;
for(int i = 1;i <= n;i++) {
a[i] = scanner.nextInt();
sum1 += a[i];
}
if(n == 0) {
return;
}
int[][] dp = new int[n+1][sum1+1];
int end1=sum1;
for(int i = 1;i<=n;i++) {
for(int j=0;j<=sum1;j++) {
if(j >= a[i]) {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - a[i]]+a[i]);
}
else {
dp[i][j] = dp[i-1][j];
}
if(dp[i][j] >=x && dp[i][j]<end1) {
end1 = dp[i][j];
}
}
}
System.out.print(end1);
}
}