背包九讲
(1) 0-1背包问题
题目链接:https://www.acwing.com/problem/content/2/
思路:动态规划求解
- 变量
- dp[i][j] 记录前i个物品在体积为j的情况下的最大价值
- v[i]:第i个物品的体积
- w[i]:第i个物品的价值
- 状态方程
- 选第i个物品:dp[i][j] = dp[i-1][j-v[i]] + w[i]
- 不选第i个物品:dp[i][j] = dp[i-1][j]
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in );
int n = in.nextInt();
int m = in.nextInt();
//int[][] dp = new int[n+1][m+1];
int[] dp = new int[m+1];
int[] w = new int[n+1];
int[] v = new int[n+1];
for(int i = 1;i<=n;i++){
v[i] = in.nextInt();
w[i] = in.nextInt();
}
for(int i = 1;i<=n;i++){
for(int j = m;j>=v[i];j--){
// dp[i][j] = dp[i-1][j];
// if(j >= v[i]){
// dp[i][j] = Math.max(dp[i][j],dp[i-1][j - v[i]] + w[i]);
// }
dp[j] = Math.max(dp[j],dp[j-v[i]] + w[i]);
}
}
System.out.println(dp[m]);
}
}
(2)完全背包问题
题目跟先前的一样,只是增加了每一个物品可以多选的条件。

