0-1背包问题
朴素写法
impor t java.util.Scanner;
public class Main{
static final int N = 1010;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//表示物品数量
int m = sc.nextInt();//表示背包容积
int[] v = new int[N];//表示物品体积
int[] w = new int[N];//表示物品价值
int [][]f = new int [N][N];//定义一个二维数组
//读入物品体积和价值
for(int i = 1; i <= n; i++){
v[i] = sc.nextInt();
w[i] = sc.nextInt();
}
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m; j++){
f[i][j] = f[i - 1][j];//左半边的子集
if(j >= v[i]) f[i][j] = Math.max(f[i][j], f[i - 1][j - v[i]] + w[i]);
//更新右半边子集,计算不放入和放入第i个物品两种情况下的最大价值,并取较大值
}
}
System.out.println(f[n][m]);//输出最大价值
}
}
代码优化写法
import java.util.Scanner;
public class Main{
static final int N = 1010;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//表示物品数量
int m = sc.nextInt();//表示背包容积
int[] v = new int[N];//表示物品体积
int[] w = new int[N];//表示物品价值
int[]f = new int [N];
//读入物品体积和价值
for(int i = 1; i <= n; i++){
v[i] = sc.nextInt();
w[i] = sc.nextInt();
}
for(int i = 1; i <= n; i++){
for(int j = m; j >= v[i]; j--){
f[j] = Math.max(f[j], f[j - v[i]] + w[i]);
}
}
System.out.println(f[m]);//输出最大价值
}
}