多重背包

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);
})


你可能感兴趣的:(多重背包)