动态规划算法介绍:
1、动态规划算法的核心思想是:将大问题划分成小问题进行解决,从而一步步获取最优解的处理算法。
2、动态规划算法与分治算法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
3、与分治不同的是,适用于动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在一个子阶段的界的基础上,进行下一步的求解)
4、动态规划可以通过填表的方式来逐步推进,得到最优解
用动态规划解决背包问题
有一个背包,容量为4磅,现有以下物品
物品 | 重量 | 价格 |
---|---|---|
吉他(G) | 1 | 1500 |
音响(S) | 4 | 3000 |
电脑(L) | 3 | 2000 |
1.要求达到的目标为装入的总价值最大,并且重量不超过
2.要求装入的物品不能重复
思路分析和图解:
1、背包问题主要是指一个给定容量的背包,若干具有一定价值的重量的物品,如何选择物品放入背包使物品的价值最大。其中有分01背包和完全背包(完全背包指的是每种物品都有无限件可用)
2、这里的问题属于01背包,即每个物品最多放一个,而无限背包可以转化为01背包
3、算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品。根据w[i](第i个物品)和v[i](第i个物品价值)来确定是否需要将该物品放入背包中,即对于给定n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,c为背包的总量。在令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大值。则我们有下结果:
(1)v[i][0] = v[0][j] = 0;
(2)当w[i]>j时:v[i][j] = v[i-1][j]
(3)当j>=w[i]时:v[i][j] = max{v[i-1][j],v[i-1][j-w[i]+v[i]]}
import java.lang.Math;
public class Main {
public static void main(String[] args) {
int[] w = {1,4,3};//物品的重量
int[] val = {1500,3000,2000};//物品的价值
int m = 4;//背包的容量
int n = val.length;//物品的个数
//创建二维数组
//v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大值
int[][] v = new int[n+1][m+1];
//初始化第一行第一列,不初始化默认是0
for (int i = 1; i < v.length; i++) {
for (int j = 1; j < v[0].length; j++) {
if(w[i-1] > j) {
v[i][j] = v[i-1][j];
}else {
v[i][j] = Math.max(v[i-1][j], val[i-1]+v[i-1][j-w[i-1]]);
}
}
}
System.out.println(v[n][m]);
}
}