private int Solve(int itemNumbers, int capacity) { if (itemNumbers == 0 /*|| capacity <= 0*/) // stop if capacity is 0 supposes that there is no item with weight 0 { return(0); } var key = new KnapSackKey(itemNumbers, capacity); if (Memoization.ContainsKey(key)) { return(Memoization[key]); } var item = Items[itemNumbers - 1]; int takeItem = item.Weight <= capacity ? Solve(itemNumbers - 1, capacity - item.Weight) + item.Value : 0; int dropItem = Solve(itemNumbers - 1, capacity); int greaterValue = Math.Max(takeItem, dropItem); Memoization[key] = greaterValue; return(greaterValue); }