【算法系列】——代码实践动态规划
2017-09-24 19:04
337 查看
之前小编对算法的理解都停留在思想的层面,从未尝试过的代码实践,大家都是想出来和做出来的差距还是比较大的。小编在网上找了一个情景,所以一个实际情况的具体解析吧。
在代码 实际过程发现,其实在计算二维表的过程,每个价值的构成包含那几件物品其实均已知,没有必要再用循环去判断。
运行结果
问题情境
根据题目说明很明显发现这是一个0-1背包问题,之前在思考动态规划问题的时候,遵循是先将各种符合动态规划的所有数据都存放到二维表格中,然后根据最大价值再去推算这个背包中需要包含哪几件物品。代码
package test; import java.util.ArrayList; import java.util.List; public class dynamicProgramming { //定义全局变量数据组 public static void main(String[] args) { List<Item> itemList = new ArrayList<Item>(); Item item = new Item(); item.setId(1); item.setSize(200); item.setV(50); itemList.add(item); Item item1 = new Item(); item1.setId(2); item1.setSize(180); item1.setV(30); itemList.add(item1); Item item2 = new Item(); item2.setId(3); item2.setSize(225); item2.setV(45); itemList.add(item2); Item item3 = new Item(); item3.setId(4); item3.setSize(200); item3.setV(25); itemList.add(item3); Item item4 = new Item(); item4.setId(5); item4.setSize(50); item4.setV(5); itemList.add(item4); int w = 100; /*上述内容模拟的数据*/ int[] i =dynamic(itemList, w+1); for (int j = 0; j < i.length; j++) { System.out.print(i[j]+";"); } } /** * * @param itemList 物品的集合 * @param w 背包的总重量 * @return */ public static int[] dynamic(List<Item> itemList,int w){ int n = itemList.size();//获取食物的项数 int[][] c = new int [w];//定义表格 int[] r = new int ; //初始化容量为空的数据 for (int i = 0; i < n; i++) { c[i][0]=0; } //初始化没有物品的数据 for (int i = 0; i < w; i++) { c[0][i]=0; } for (int i = 1; i < n; i++) { for (int j = 0; j < w; j+=5) { if (j<itemList.get(i).getV()) { c[i][j]=c[i-1][j]; // 没在背包中,则赋值为0 r[i]=0; }else if (c[i-1][j-itemList.get(i).getV()]+itemList.get(i).getSize()<c[i-1][j]){ c[i][j]=c[i-1][j]; // 没在背包中,则赋值为0 r[i]=0; }else { c[i][j]=c[i-1][j-itemList.get(i).getV()]+itemList.get(i).getSize(); // 在背包中,则赋值为1 r[i]=1; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < w; j+=5) { System.out.print(c[i][j]+";"); } System.out.println(); } return r; } }
在代码 实际过程发现,其实在计算二维表的过程,每个价值的构成包含那几件物品其实均已知,没有必要再用循环去判断。
运行结果
【总结】
在思路正确的情况下,还的在实践的过程,才能发现代码到底有哪地方可以继续优化!功力尚浅,慢慢学习吧!相关文章推荐
- 【算法系列】——代码实践动态规划
- 基础算法系列总结:动态规划(解公司外包成本问题)
- 【算法系列】——重新认识动态规划
- 算法细节系列(9):动态规划之01背包
- 石子合并;圈型;动态规划;重点在于处理圈型问题;代码内有算法解释;
- 动态规划实践,美团面试题算法实现
- 算法细节系列(14):动态规划之字符串处理
- 基础算法系列总结:动态规划(解公司外包成本问题)
- 算法原理与实践(动态规划与递归)
- 算法细节系列(11):再谈动态规划
- 『算法设计_伪代码』动态规划问题
- 我的代码审查实践(25分钟看完系列)
- 动态规划(3)——算法导论(18)
- 动态规划解机器调度问题——算法解题报告
- 动态规划之背包问题之逻辑(无代码)
- 算法题——Unique Paths(C++)动态规划
- 敏捷开发松结对编程系列之十:代码审查最佳实践
- 蓝桥杯 ALGO-21算法训练 装箱问题(动态规划,01背包)
- 应用动态规划的算法
- 算法学习之动态规划(leetcode 91 Decode Ways)