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);
        }