您现在的位置:首页 >> 前端 >> 内容

背包问题--部分背包

时间:2017/5/5 17:02:00 点击:

  核心提示:背包问题--部分背包script/** 背包问题:* 从M件物品中取出若干个放在容积为W的背包中,* 已知每件物品的体重是 w1,w2,...,wn* 已知每件物品的价值是 p1,p2,...,pn*...

背包问题--部分背包




<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>

作者:网络 来源:光明大神棍的博客