动态规划--01背包问题(2)
2017-07-13 14:28
162 查看
根据前面的分析,我们已经画出了一个表格,表格的最后一个格子是背包的最大价值,在展示代码实现前,我还是想先说一下写代码前的思路,毕竟,有了思路才能行文如流水。没错,下面要说动态规划的步骤。
1. 刻画背包问题的最优解的结构:
如果一个问题的最优解包含了物品n,那么其余n-1个物品一定构成了子问题在容量为W-Wn时的最优解;如果这个问题的最优解不包含物品n,那么其余n-1个物品一定构成了子问题在容量为W时的最优解。
2. 递归定义最优解的值
F(n,W) =0 (n=0或W=0);
F(n,W)=F(n-1,W) (W<Wn);
F(n,W) = max(F(n-1,W),F(n-1,W-Wn) + Vn) (n>0且Wn<=W)
3. 计算背包问题最优解的值(终于可以看代码了)
运行结果:
![](https://img-blog.csdn.net/20170713142709339?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1YW56aGUxMTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
到这里我们已经求得了背包的最大价值。但,我们究竟在包里放入了哪几个物品该怎么算呢?
未完待续……
小编嘱咐:
一定要自己把那个递归的定义式写一写,确保自己明白了哦。
1. 刻画背包问题的最优解的结构:
如果一个问题的最优解包含了物品n,那么其余n-1个物品一定构成了子问题在容量为W-Wn时的最优解;如果这个问题的最优解不包含物品n,那么其余n-1个物品一定构成了子问题在容量为W时的最优解。
2. 递归定义最优解的值
F(n,W) =0 (n=0或W=0);
F(n,W)=F(n-1,W) (W<Wn);
F(n,W) = max(F(n-1,W),F(n-1,W-Wn) + Vn) (n>0且Wn<=W)
3. 计算背包问题最优解的值(终于可以看代码了)
/** * 01背包问题:有一个背包可盛的重量为4,现有3个物品,重量和价值如下表,问:如何让包内装入的物品具有最大的总价值? * Created by gu.haiyan on 2017/7/10. */ public class DynamicProgramming_01bag { //动态规划法求解 public static int getMostValueByDP(int n, int w, int[] values, int[] weights){ int[] preResults = new int[w+1]; int[] results = new int[w+1]; //填充表格第一行,也就是只有一个物品的情况 for (int i = 1; i <= w; i++) { if (i < weights[0]){ preResults[i] = 0; }else { preResults[i] = values[0]; } System.out.print(" " + preResults[i]); } System.out.println(""); //填充表格剩余行数 for (int i = 1; i < n; i++) { for (int j = 1; j <= w; j++) { if (j < weights[i]){ results[j] = preResults[j]; System.out.print(" " + results[j]); }else { results[j] = Math.max(preResults[j],preResults[j-weights[i]] + values[i]); System.out.print(" " + results[j]); } } preResults = results; System.out.println(""); } return results[w]; } public static void main(String[] args) { int[] g = {1500,3000,2000}; int[] p = {1,4,3}; int gold = getMostValueByDP(3,4,g,p); System.out.println("最大价值是 " +gold); } }
运行结果:
到这里我们已经求得了背包的最大价值。但,我们究竟在包里放入了哪几个物品该怎么算呢?
未完待续……
小编嘱咐:
一定要自己把那个递归的定义式写一写,确保自己明白了哦。
相关文章推荐
- 动态规划——01背包问题
- (精)hdoj 2602(01背包问题)(动态规划)
- 算法导论_01背包问题.(动态规划)
- 算法导论三剑客之 动态规划 01背包问题
- 动态规划求解01背包问题
- 01背包问题(动态规划DP)
- Dynamic Programming 0-1 knapsacks 动态规划之01背包问题
- 动态规划之01背包问题
- 动态规划之01背包问题和三角形问题
- 算法基础-动态规划 (1) 01背包问题
- 动态规划之01背包问题(最易理解的讲解)
- POJ 3624 Charm Bracelet 动态规划(01背包问题)
- 01背包问题,动态规划求解
- 01背包问题(动态规划)
- 动态规划_01背包问题
- 苹果(01背包问题)——动态规划
- 动态规划求解01背包问题初探(C版)
- 饮食问题--01背包--动态规划
- 【转】 01背包问题 动态规划解法
- 动态规划的详细解析(01背包问题)