您的位置:首页 > 其它

背包问题--部分背包

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  部分背包