1、01背包
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int[][] dp=new int[n+1][m+1];
int[] v=new int[n+1];
int[] w=new int[n+1];
for(int i=1;i<=n;i++) {
v[i]=scan.nextInt();
w[i]=scan.nextInt();
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(v[i]>j) {
dp[i][j]=dp[i-1][j];
}else {
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-v[i]]+w[i] );
}
}
}
System.out.println(dp[n][m]);
}
}
2、完全背包
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int[][] dp=new int[n+1][m+1];
int[] v=new int[n+1];
int[] w=new int[n+1];
for(int i=1;i<=n;i++) {
v[i]=scan.nextInt();
w[i]=scan.nextInt();
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
dp[i][j]=dp[i-1][j];
if(j>=v[i]) {
dp[i][j]=Math.max(dp[i][j], dp[i][j-v[i]]+w[i]);
}
}
}
System.out.println(dp[n][m]);
}
}
3、多重背包1
数据范围
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int[][] dp=new int[n+1][m+1];
int[] v=new int[n+1]; //体积
int[] w=new int[n+1]; //价值
int[] c=new int[n+1]; //重量
for(int i=1;i<=n;i++) {
v[i]=scan.nextInt();
w[i]=scan.nextInt();
c[i]=scan.nextInt();
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
dp[i][j]=dp[i-1][j];
for(int k=1;k<=c[i]&&v[i]*k<=j;k++) {
dp[i][j]=Math.max(dp[i][j], dp[i-1][j-v[i]*k]+w[i]*k);
}
System.out.print(dp[i][j]+" ");
}
System.out.println();
}
System.out.println(dp[n][m]);
}
}
4、多重背包2
数据范围
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(), m = in.nextInt();
// 使用列表存储二进制优化后的物品
int[] newV = new int[2000*11];
int[] newW = new int[2000*11];
int[] dp = new int[m + 1];
int count = 0;
// 二进制优化处理
for (int i = 1; i <= n; i++) {
int v = in.nextInt();
int w = in.nextInt();
int c = in.nextInt();
// 二进制拆分(将数量c分解为1,2,4...的幂次方组合)
for (int k = 1; k <= c; k *= 2) {
newV[count]=(v * k);
newW[count]=(w * k);
c -= k;
count++;
}
if (c > 0) {
newV[count]=(v * c);
newW[count]=(w * c);
count++;
}
}
// 转化为01背包问题
for (int i = 0; i < count; i++) {
// 01背包处理逻辑
for (int j = m; j >= newV[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - newV[i]] + newW[i]);
}
}
System.out.println(dp[m]);
}
}