动态规划法常见的题型
* 动规基础
* 背包问题
* 打家劫舍
* 股票问题
* 子序列问题
* 解题五步骤:
* dp数组以及下标的含义
* 递推公式
* dp数组的初始化
* 遍历顺序
* 打印dp数组
*动态规划法解决0、1背包问题
* 问题描述 * 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? * 为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8 * i(物品编号) 1 2 3 4 * w(体积) 2 3 4 5 * v(价值) 3 4 5 6
* 问题描述
* 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
* 为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8
* i(物品编号) 1 2 3 4
* w(体积) 2 3 4 5
* v(价值) 3 4 5 6
package com.day;
public class Demo12 {
public static void main(String[] args) {
// 商品的体积为2,3,4,5
int []weight={0,2,3,4,5};
// 商品的价值为3,4,5,6
int []value={0,3,4,5,6};
// 定义背包的体积大小
int bagCapacity=8;
// 定义一个dp数组并初始化动态规划表
int[][] dp =new int[5][9];
// 先遍历物品
for (int i=1;i<=4;i++){
// 再遍历背包
for (int j=1;j<=bagCapacity;j++){
if(j<weight[i]){
dp[i][j]=dp[i-1][j];
}else
// 对dp数组的递推公式进行处理,来推导出递推公式
// j-weight[i]表示的是背包装入i-1个物品后背包的剩余的容量大小
dp[i][j]= Math.max(dp[i-1][j],dp[i-1][j-weight[i]])+value[i];
}
}
// 动态规划表的输出
// 变量物品的编号
for (int i=0;i<5;i++){
for (int j=0;j<9;j++){
System.out.println(dp[i][j]);
}
}
}
}
动态规划法:比较重要的就是对理解dp数组的下标含义,还有就是递推公式很重要,数组的元素必定是由它的上方的元素和左上方的元素推出来的。