这里只是做一个代码记录,不做背包详解,代码注释都有,应该一看就懂。首先是问题描述如下:
接下来是二维的动态规划和一维的动态规划,Java版本。
import java.util.Scanner;
import java.lang.*;
public class Main{
public static void main(String[] args){
// 创建输入的Scanner
Scanner sc = new Scanner(System.in);
// 首先读取N和V 也就是物品的数目和背包容量
int n = sc.nextInt();
int v = sc.nextInt();
sc.nextLine();
// 创建体积数组和价值数组
int[] volume = new int[n+1];
int[] value = new int[n+1];
for(int i = 1;i <= n;++i){
volume[i] = sc.nextInt();
value[i] = sc.nextInt();
}
// 创建dp数组 dp[number+1][volume+1]
int[][] dp = new int[n+1][v+1];
// 首先枚举数目 然后枚举背包容量
for(int i = 1;i<=n;++i){
for(int j = 0;j<=v;++j){
// 先这样赋值 为了之后方便
dp[i][j] = dp[i-1][j];
if(j>=volume[i]){
// 说明背包能装下 那么背包最大价值从装和不装中产生
dp[i][j] = Math.max(dp[i-1][j-volume[i]]+value[i],dp[i][j]);
}
}
}
// 输出最大价值
System.out.println(dp[n][v]);
}
}
import java.util.Scanner;
import java.lang.*;
public class Main{
public static void main(String[] args){
// 创建输入的Scanner
Scanner sc = new Scanner(System.in);
// 首先读取N和V 也就是物品的数目和背包容量
int n = sc.nextInt();
int v = sc.nextInt();
sc.nextLine();
// 创建体积数组和价值数组
int[] volume = new int[n+1];
int[] value = new int[n+1];
for(int i = 1;i <= n;++i){
volume[i] = sc.nextInt();
value[i] = sc.nextInt();
}
// 创建dp数组 dp[number+1][volume+1]
int[] dp = new int[v+1];
// 直接枚举背包容量 从大到小枚举 是因为换成一维DP之后 等式右边的是物品数目i-1的dp[j]
// 如果还是顺序更新那么较小的j会被更新 而较小的j在后面会被用到
// 如果是逆序更新 那么更新的是大j 大j是不会在后面被用到的
for(int i = 1;i<=n;++i){
for(int j = v;j>=volume[i];j--){
dp[j] = Math.max(dp[j-volume[i]]+value[i],dp[j]);
}
}
System.out.println(dp[v]);
}
}
Q.E.D.