Skip to content

Knapsack Light

You found two items in a treasure chest! The first item weighs weight1 and is worth value1, and the second item weighs weight2 and is worth value2. What is the total maximum value of the items you can take with you, assuming that your max weight capacity is maxW and you can't come back for the items later?

Note

that there are only two items and you can't bring more than one item of each type, i.e. you can't take two first items or two second items.

Example

  • For value1 = 10, weight1 = 5, value2 = 6, weight2 = 4, and maxW = 8, the output should be

    knapsack_light(value1, weight1, value2, weight2, maxW) = 10

    You can only carry the first item.

  • For value1 = 10, weight1 = 5, value2 = 6, weight2 = 4, and maxW = 9, the output should be

    knapsack_light(value1, weight1, value2, weight2, maxW) = 16

    You're strong enough to take both of the items with you.

  • For value1 = 5, weight1 = 3, value2 = 7, weight2 = 4, and maxW = 6, the output should be

    knapsack_light(value1, weight1, value2, weight2, maxW) = 7

    You can't take both items, but you can take any of them.

Solution

py
def knapsack_light(value_1, weight_1, value_2, weight_2, max_weight):
    # can you carry both?
    if weight_1 + weight_2 <= max_weight:
        return value_1 + value_2

    # nope... only one; if you can carry either, then choose the costliest
    if weight_1 <= max_weight and weight_2 <= max_weight:
        return max(value_1, value_2)

    # one of them is heavy for you; so pick the one you can
    if weight_1 <= max_weight:
        return value_1
    elif weight_2 <= max_weight:
        return value_2

    # you are too weak to carry either; do some push-ups
    return 0


print(knapsack_light(5, 3, 7, 4, 6))
print(knapsack_light(15, 2, 20, 3, 2))
print(knapsack_light(10, 5, 6, 4, 8))
print(knapsack_light(10, 5, 6, 4, 9))

my thoughts are neither my employer's nor my wife's