1.背包问题
1)01背包问题
二维:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int v = scan.nextInt();
int[] a = new int[n + 1];
int[] b = new int[n + 1];
for(int i = 1 ; i <= n; i ++){
a[i] = scan.nextInt();
b[i] = scan.nextInt();
}
scan.close();
int[][] dp = new int[n + 1][v + 1];
dp[0][0] = 0;
for(int i = 1; i <= n ; i ++){
for(int j = 1; j <= v; j ++){
if (j >= a[i]){
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - a[i]] + b [i]);
}else{
dp[i][j] = dp[i - 1][j];
}
}
}
System.out.println(dp[n][v]);
}
}
二维优化为一维:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int v = scan.nextInt();
int[] a = new int[n + 1];
int[] b = new int[n + 1];
for(int i = 1 ; i <= n; i ++){
a[i] = scan.nextInt();
b[i] = scan.nextInt();
}
scan.close();
int[] dp = new int[v + 1];
dp[0] = 0;
for(int i = 1; i <= n ; i ++){
for(int j = v; j >= a[i]; j --){
dp[j] = Math.max(dp[j], dp[j - a[i]] + b [i]);
}
}
System.out.println(dp[v]);
}
}
2)完全背包问题
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int v = scan.nextInt();
int[] a = new int[n + 1];
int[] b = new int[n + 1];
for(int i = 1; i <= n; i ++){
a[i] = scan.nextInt();
b[i] = scan.nextInt();
}
int[][] dp = new int[n + 1][v + 1];
for(int i = 1; i <= n; i ++){
for(int j = 0; j <= v; j ++){
for(int k = 0; k * a[i] <= j; k ++){
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * a[i]] + k * b[i]);
}
}
}
System.out.println(dp[n][v]);
}
}
稍作优化
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int v = scan.nextInt();
int[] a = new int[n + 1];
int[] b = new int[n + 1];
for(int i = 1; i <= n; i ++){
a[i] = scan.nextInt();
b[i] = scan.nextInt();
}
int[][] dp = new int[n + 1][v + 1];
for(int i = 1; i <= n; i ++){
for(int j = 0; j <= v; j ++){
if(a[i] <= j){
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - a[i]] + b[i]);
}else{
dp[i][j] = dp[i - 1][j];
}
}
}
System.out.println(dp[n][v]);
}
}