$$\color{Red}{混合背包问题:(两个方法:1 转化为多重背包 2 混合背包模型)}$$
这里附带打个广告——————我做的所有的题解
包括基础提高以及一些零散刷的各种各样的题
java 直接把所有物品转化为多重背包
混合背包只需要深刻理解,每当加入一个物品,其实我们只是在已有的方程基础上进行判断加入它,所以它是什么类型,就还按什么类型转移就行。
当一个物品标记为是完全背包也就是无数个的情况下,我们可以认定它的最大数量为 m / v 也就是全用来放它最多放的个数,如果是01背包,只需要把它当成一个物品
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N = 1010, n, m, v, w, s;
static int[] f = new int[N];
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String[] s1 = br.readLine().split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
for (int i = 1; i <= n; i++) {
String[] s2 = br.readLine().split(" ");
v = Integer.parseInt(s2[0]);
w = Integer.parseInt(s2[1]);
s = Integer.parseInt(s2[2]);
if (s == 0) s = (int) m / v;
if (s == -1) s = 1;
for (int k = 1; k <= s; k *= 2) {
for (int j = m; j >= k * v; j--)
f[j] = Math.max(f[j], f[j - k * v] + k * w);
s -= k;
}
if (s > 0)
for (int j = m; j >= s * v; j--)
f[j] = Math.max(f[j], f[j - s * v] + s * w);
}
System.out.println(f[m]);
}
}
java 混合背包模板
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N = 1010, n, m, v, w, s;
static int[] f = new int[N];
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String[] s1 = br.readLine().split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
for (int i = 1; i <= n; i++) {
String[] s2 = br.readLine().split(" ");
v = Integer.parseInt(s2[0]);
w = Integer.parseInt(s2[1]);
s = Integer.parseInt(s2[2]);
if (s == 0) {
for (int j = v; j <=m; j++)
f[j] = Math.max(f[j], f[j - v] + w);
} else {
if (s == -1) s = 1;
for (int k = 1; k <= s; k *= 2) {
for (int j = m; j >= k * v; j--)
f[j] = Math.max(f[j], f[j - k * v] + k * w);
s -= k;
}
if (s > 0)
for (int j = m; j >= s * v; j--)
f[j] = Math.max(f[j], f[j - s * v] + s * w);
}
}
System.out.println(f[m]);
}
}