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(', '));