美文网首页
多重背包

多重背包

作者: 张霸天 | 来源:发表于2017-08-22 14:18 被阅读0次
    function PackageItem (name, weight, value, count){
        this.name = name;
        this.weight = weight;
        this.value = value;
        this.count = count;
    }
    
    function get01PackageAnswer(bagItems , bagsize) {
        var bagMatrix = [];
        var i ;
        var item;
    
        for (i = 0; i < bagItems.length; i++) {
            bagMatrix[i] = [0];
        }
    
        for (i = 1; i <= bagsize;i++) {
            for (var j = 0; j < bagItems.length; j++) {
                item = bagItems[j];
                if (item.weight > i) 
                {
                    if (j==0) {
                        bagMatrix[j][i] = 0;
                    } else {
                        bagMatrix[j][i] = bagMatrix[j-1][i];
                    }
                }
                else 
                {
                    var itemInBag;
                    if (j == 0) {
                        bagMatrix[j][i] = item.value;
                        continue ;
                    } else {
                        itemInBag = bagMatrix[j-1][i-item.weight] + item.value; //向上向下找都无所谓,只要安一定的顺序找就行了
                    }
                    bagMatrix[j][i] = (bagMatrix[j-1][i] > itemInBag ? bagMatrix[j-1][i] : itemInBag);//比较下现在的情况是不是比不动要好 0+6 < 7 就不动
                }
            }
        }
    
        var answers = [];
        var curSize = bagsize;
    
        for ( i = bagItems.length - 1; i >= 0; i--) {
            item = bagItems[i];
            if (curSize == 0) 
                break;
            
            if (i == 0 && curSize  > 0) {
                answers.push(item.name);
                break;
            }
    
            if (bagMatrix[i][curSize] - bagMatrix[i-1][curSize - item.weight] == item.value) {
                answers.push(item);
                curSize -= item.weight;
            }
        }
        return answers;
    }
    
    
    
    /** split result 真的很容易理解,成倍出现,
    a:1
    b:1
    b:1
    c:1
    c:2
    d:1
    d:2
    d:1
    e:1
    e:2
    e:2
    */
    function split(items) {
        var splitedItems = [];
        for (var i = 0; i < items.length; i++) {
            for (var j = 1; j <= items[i].count; j = j * 2) {
                let item = new PackageItem(items[i].name,items[i].weight * j,items[i].value * j, j);
                splitedItems.push(item);
                items[i].count -= j;
            }
            if (items[i].count > 0) {
                let item = new PackageItem(items[i].name,items[i].weight * items[i].count,items[i].value * items[i].count, items[i].count);
                splitedItems.push(item);
            }
        }
    
        return splitedItems;
    }
    
    
    
    var nameArr = ['a','b','c','d','e'];
    var weightArr = [3,2,6,5,4];
    var valueArr = [6,3,13,4,6];
    var countArr = [1,2,3,4,5]
    
    
    var bagItems = [];
    
    for (var i = 0; i < nameArr.length; i++) {
        var bagItem = new PackageItem(nameArr[i],weightArr[i],valueArr[i],countArr[i]);
        bagItems[i] = bagItem;
    }
    
    var splitedItems = split(bagItems);
    
    var arr = get01PackageAnswer(splitedItems,23);
    
    arr.forEach(function(item,index,array) {
        console.log(item.name + ":" + item.count);
    })
    
    
    

    相关文章

      网友评论

          本文标题:多重背包

          本文链接:https://www.haomeiwen.com/subject/dykldxtx.html