大家好,我是晴天学长,今天的题目是动态规划经典题目-背包类的题,是入门级别的动态规划题,需要的小伙伴请自取哦!💪💪💪
1 )小明的背包
2) .算法思路
1.建立三个一维数组,接收数据。
2.从数组后面遍历(滚动数组的定义)。
3.更新状态转移方程(选或者不选)。
4.注意数组下标越界的问题。
3).代码示例
package LanQiaoTest.动态规划;
import java.util.Scanner;
// f[i][j] 表示只考虑i个物品 且背包的容量为j的最大价值是多少
// 答案就应该是 f[n][m]
public class 小明的背包1 {
static int N = 1010;
static int[] f = new int[N];
static int[] V = new int[N];
static int[] w = new int[N];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
for (int i = 1; i <= n; i++) {
w[i] = scanner.nextInt();
V[i] = scanner.nextInt();
}
for (int i = 1; i <= n; i++) {
for (int j = m; j >= w[i]; j--) {
//选或者不选
//先考虑不选
//可以不用写,但思路明确一些。
// f[j] = f[j];
//在考虑选
if (j >= w[i]) {
//j-w[i]作用是为了选的时候保证不超过j的容量
f[j] = Math.max(f[j], f[j - w[i]] + V[i]);
}
}
}
System.out.println(f[m]);
}
}
3 .)总结
- 一定要清楚动态规划的动态转移方程的定义,可以想象成树的剪枝,并用表记录下来。
- 滚动数组的做法,可以优化空间复杂度