编辑代码

function knapsack(items, capacity, currentItem, memo) {
    if (currentItem < 0 || capacity === 0) {
        return { value: 0, items: [] };
    }

    if (memo[currentItem][capacity] !== undefined) {
        return memo[currentItem][capacity];
    }

    if (items[currentItem].weight > capacity) {
        return knapsack(items, capacity, currentItem - 1, memo);
    }

    const includeItemResult = knapsack(
        items,
        capacity - items[currentItem].weight,
        currentItem - 1,
        memo
    );
    const includeItem = items[currentItem].value + includeItemResult.value;
    const excludeItemResult = knapsack(items, capacity, currentItem - 1, memo);
    const excludeItem = excludeItemResult.value;

    let result;
    if (includeItem > excludeItem) {
        result = {
            value: includeItem,
            items: [...includeItemResult.items, items[currentItem]]
        };
    } else {
        result = excludeItemResult;
    }

    memo[currentItem][capacity] = result;
    return result;
}

const items = [
    { weight: 15, value: 1500, name: '吉他' },
    { weight: 20, value: 2000, name: '笔记本电脑' },
    { weight: 30, value: 3000, name: '音响' }
];

const capacity = 50;
const memo = new Array(items.length).fill(null).map(() => new Array(capacity + 1));

const result = knapsack(items, capacity, items.length - 1, memo);
console.log("最大价值:", result.value);
console.log("所选商品:", result.items.map(item => item.name).join(', '));