1.动态规划的核心思想:
将大问题分解成小问题,从而一步步获取最优解的处理算法(有局部最优解退出全局最优解)
2.动态规划与分治的相同点:
将大问题分分解成小问题,通过解决小问题,来解决原问题
3.动态规划与分治的不同:
动态规划各个小问题之间存在着联系,分治算法,咯咯咯小问题之间相互独立
4.动态规划可通过填表的方式获得
运行结果:
package dataStruct.常用算法; import java.util.ArrayList; import
java.util.Hashtable; public class 动态规划求解01背包问题 { public static void
main(String[] args) { //定义重量的数组 int[] w = {1, 4, 3}; //定义物品的价值 int[] val =
{1500, 3000, 2000}; //定义不同重量的最大价值 int n = 5;//定义背包的容量 int[][] v = new
int[w.length + 1][n + 1]; int[][] path = new int[w.length + 1][n + 1];
//对不同v[][]进行赋值 for (int i = 1; i < v.length; i++) { for (int j = 1; j <
v[0].length; j++) { //如果当前背包的容量小于第i个商品的重量,将上一行的值,复制到当前行 if (j < w[i-1]) {
v[i][j] = v[i - 1][j]; } else {//否则背包容量大于当前商品的重量
//如果当前商品的价值+背包减去当前商品的重量后,剩余容量的价值 > 上一行的价值,就将上一行的价值赋给当前行 if (v[i - 1][j] < val[i
- 1] + v[i - 1][j - w[i - 1]]) { v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
path[i][j] = 1; } else { v[i][j] = v[i - 1][j]; } } } } for (int i = 0; i <
v.length; i++) { for (int j = 0; j < v[1].length; j++) { System.out.print(" " +
v[i][j]); } System.out.println(); } int i = path.length - 1; int j =
path[0].length - 1; while (i > 0 && j > 0){ if (path[i][j] == 1){
System.out.printf("第%d个商品放到背包中\n",i); j -= w[i-1];//减掉当前商品的重量,为剩余重量 } i--; } } }