knapsack problem dynamic programming example