题目描述
有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积。
现在从 n 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。
输入格式
第一行共一个整数 nV,表示箱子容量。
第二行共一个整数 n,表示物品总数。
接下来 n 行,每行有一个正整数,表示第 ni 个物品的体积。
输出格式
- 共一行一个整数,表示箱子最小剩余空间。
输入输出样例
输入 #1复制
24 6 8 3 12 7 9 7
输出 #1复制
0
说明/提示
对于 100%100% 数据,满足 0<n≤300<n≤30,1≤n≤200001≤V≤20000。
【题目来源】
NOIP 2001 普及组第四题
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int v = sc.nextInt();
int n = sc.nextInt();
int[] w = new int[n + 1];
for (int i = 1; i <= n; i++) {
w[i] = sc.nextInt();
}
// 1.dp的含义: dp为在指定背包容量范围内,选出最大的可装重量
int[] dp = new int[v + 1];
// 2.dp的初始化,这里dp默认为0即可
// 3.确定遍历顺序
for (int i = 1; i <= n; i++) {
for (int j = v; j >= w[i]; j--) {
// 4.递推公式
dp[j] = Math.max(dp[j], dp[j - w[i]] + w[i]);
}
}
// 5. 打印dp数组
// for (int i : dp) {
// System.out.println();
// }
System.out.println(v-dp[v]);
}
}