0 1 knap

weights = [2,3,4,5]

values = [1,2,5,6]

capacity = 8

def knapsack_01(weights, values, capacity):

    n = len(weights)

    dp = [[0] * (capacity + 1) for _ in range(n + 1)]

    # Build DP table

    for i in range(1, n + 1): #row

        for w in range(1, capacity + 1):  #column

            if weights[i – 1] <= w:

                dp[i][w] = max(values[i – 1] + dp[i – 1][w – weights[i – 1]],    dp[i – 1][w])

            else:

                dp[i][w] = dp[i – 1][w]

    # Backtrack to find selected items

    w = capacity

    selected = []

    for i in range(n, 0, -1):  #reverse order from 8 ex.

        if dp[i][w] != dp[i – 1][w]:  #upar wala element usi column ka

            selected.append(i – 1)

            w -= weights[i – 1]

    selected.reverse()

    return dp[n][capacity], selected

max_value, selected_items = knapsack_01(weights, values, capacity)

print(“Maximum Value:”, max_value)

print(“Selected Items (index):”, selected_items)