背包问题--部分背包
2017-04-28 16:12
190 查看
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> /* * 背包问题: * 从M件物品中取出若干个放在容积为W的背包中, * 已知每件物品的体重是 w1,w2,...,wn * 已知每件物品的价值是 p1,p2,...,pn * 如何装物品,实现最大价值?? * * 类型:分为01背包和部分背包 * 01背包:指背包中的物体是不可分割的,如手机,相机,解决方案---动态规划方案 * * 部分背包:指背包中的物体可以分割,如大米,水,解决方案---贪心算法 * * * */ let M = 5; let W = 16; let arrP = [4,5,10,11,12]; let arrW = [3,4,7,8,9]; /* * 动态规划背包---求最大值: * M --- 一共有多少件物品 * W --- 背包的最大承载量 * arrW --- 每件物品的重量 * arrP --- 每件物品的价值 * * 原理:根据比例来 * r : arrP[i] / arrW[i] * 然后进行排序,依次添加 * 如果arrW[i] < W,可拆分 * * */ function plan(M, W, arrW, arrP) { var result = 0; var newArr = []; // 计算比例,创建新数组 for ( var i = 0; i < M; i++ ) { newArr.push({ w : arrW[i], p : arrP[i], r : arrP[i] / arrW[i] }); } // 按照比例排序(降序),一遍装包操作 newArr.sort(function (obj1, obj2) { return obj2.r - obj1.r; }); // 依次按照比例大小开始装包 for( var i = 0; i < newArr.length; i++ ) { if( newArr[i].w <= W ) { result += newArr[i].p; W -= newArr[i].w; //console.log(result, '', W); } // 开始拆分装包 else { result += W / newArr[i].w * newArr[i].p; break; } } return result.toFixed(2); } console.log(plan(M, W, arrW, arrP)); </script> </body> </html>
相关文章推荐
- 贪心法:部分背包问题
- 部分背包问题(贪心算法)
- 部分背包问题贪心选择性质的证明
- 0-1背包和部分背包问题
- 挑战程序设计竞赛 多重部分和问题(恰好装满的完全背包)
- 贪心算法——部分背包问题(贪心策略内容)
- 部分背包问题-贪心法源码
- 贪心算法练习题:部分背包问题
- 纯C语言:贪心部分背包问题源码
- 多部分和问题(多重背包+二进制优化)
- 部分背包问题模板
- 背包问题(01背包、完全背包、部分背包)
- 贪心算法解决部分背包问题
- 【算法】贪心策略实现部分背包问题
- 经典算法6:贪心算法解决部分背包问题
- 贪心算法;部分背包问题;快速排序O(nlgn);贪心算法O(n);
- 【算法导论】0-1背包问题 与 部分背包
- 8.4.2(部分背包问题)
- 贪心法求解背包问题(部分背包 物品可分)
- HDU1059 多重背包 多重部分和问题DP