背包问题
int f[][] = new int[n + 1][V + 1]; // 前i个元素凑成的子集和为j最短长度。
f[0][0] = 0; // 不用选任何元素即满足,长度0
for (int i = 1; i <= n; i++) {
f[i][0] = Integer.MAX_VALUE;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= V; j++) {
f[i][j] = f[i - 1][j]; // 默认不选物品i
if (j - nums[i] >= 0 && f[i - 1][j - nums[i]] != Integer.MAX_VALUE) {
// 与选择i时能达到的长度比较,选择了i意味着用前i-1个物品装满j - nums[i]
f[i][j] = Math.min(f[i][j], f[i - 1, j - nums[i]] + 1);
}
}
}
return f[n][V];Last updated