import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int V = scanner.nextInt(); int n = scanner.nextInt(); int[] volumes = new int[n]; for (int i = 0; i < n; i++) { volumes[i] = scanner.nextInt(); } boolean[] dp = new boolean[V + 1]; dp[0] = true; for (int v : volumes) { for (int i = V; i >= v; i--) { if (dp[i - v]) { dp[i] = true; } } } int maxSum = 0; for (int i = V; i >= 0; i--) { if (dp[i]) { maxSum = i; break; } } System.out.println(V - maxSum); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取箱子容量V、物品个数n以及每个物品的体积。
- 动态规划数组初始化:
dp
数组的大小为V+1,初始时只有dp[0]
为true。 - 状态转移:对于每个物品的体积,逆序遍历可能的容量,更新
dp
数组,确保每个物品只被考虑一次。 - 寻找最大体积和:从V开始向下遍历,找到最大的i使得
dp[i]
为true,计算并输出剩余空间V - i。