CSP 202209-2 何以包邮?java 满分题解
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n, x;
n = scanner.nextInt();
x = scanner.nextInt();
int[] w = new int[n + 1];
int sum = 0;
for (int i = 1; i <= n; i++) {
w[i] = scanner.nextInt();
sum += w[i];
}
int c = sum - x;
int[][] dp = new int[n + 1][c + 1];
for (int j = 1; j <= c; j++) {
for (int i = 1; i <= n; i++) {
if (w[i] > j) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i]] + w[i]);
}
}
}
System.out.print(sum - dp[n][c]);
scanner.close();
}
}
总结
1、问题简化 转化为自己认识的问题 使用已有的知识解决
2、01背包问题 动态规划:
- 确认 具体的变量值 状态值都有什么类型 根据什么求什么
- 确认 状态数组 dp[i][j]的具体含义
- 确定 状态转移方程
- 状态数组的边界值初始化 0
- 确定遍历的顺序 写for循环
- 可能存在的回溯求结果序列
3、01背包问题的变形 类似问题求解