[算法]体积不小于V的情况下的最小价值(0-1背包)

时间:2023-03-09 18:28:16
[算法]体积不小于V的情况下的最小价值(0-1背包)

题目

0-1背包问题,问要求体积不小于V的情况下的最小价值是多少。

相关

转移方程很容易想,初始化的处理还不够熟练,可能还可以更简明。

使用一维dp数组。

代码

import java.util.Scanner;

public class Main{
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int V = sc.nextInt();
int[] v = new int[n + 1];
int[] w = new int[n + 1];
int vSum = 0;
for (int i = 1; i <= n; ++i) {
v[i] = sc.nextInt();
w[i] = sc.nextInt();
vSum += v[i];
} int[] dp = new int[V + 1];
dp[0] = 0;
for (int j = 1; j <= V; ++j) {
dp[j] = Integer.MAX_VALUE;
}
for (int i = 1; i < n + 1; ++i) {
for (int j = V; j >= v[i]; --j) {
if (dp[j] == Integer.MAX_VALUE && dp[j - v[i]] == Integer.MAX_VALUE) {
dp[j] = Integer.MAX_VALUE;
} else if (dp[j] == Integer.MAX_VALUE) {
dp[j] = dp[j - v[i]] + w[i];
} else if (dp[j - v[i]] == Integer.MAX_VALUE) {
dp[j] = dp[j];
} else {
dp[j] = Math.min(dp[j], dp[j - v[i]] + w[i]);
}
}
for (int j = v[i] - 1; j >= 0; --j) {
dp[j] = Math.min(dp[j], w[i]);
}
} System.out.println(dp[V]);
}
}