闫氏DP分析法
以下为总结y总直播的内容,视频原址。思维是视频中的思维,代码是自己用Java写的。y总yyds!
核心:从集合角度来分析
有限集中的最值
动态规划两个阶段:
- 状态表示(化零为整)
- 集合
- 属性:max,min,count
- 状态计算(化整为零)
- 集合划分:不重复,不遗漏
- 划分依据:寻找最后一个不同点
0-1背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数N,V用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
思路:
- 状态表示(化零为整)
- 集合:所有只考虑前i个物品,且总体积不超过j的选法的集合
- 属性:max
- 状态计算(化整为零)
- 集合划分:所有不选第i个物品的方案vs所有选择第i个物品的方案
- 划分依据:寻找最后一个不同点
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int V = scan.nextInt();
int[][] thing = new int[N][2];
for(int i = 0; i < N; i++){
thing[i][0] = scan.nextInt();
thing[i][1] = scan.nextInt();
}
//int[][] dp = new int[N+1][V+1];
int[] dp = new int[V+1];
for(