private void BuildTree(KnapsackNode node, KnapsackItem[] ksItems)
        {
            //if possible add contents of next ksitem to node
            //  if so recruse with remaining items
            //  if not determine if best and set if so

            //also, recurse with unchanged node items and remaining items

            if (ksItems.Length == 0) return;

            var item = ksItems.First();
            var newValue = node.AccumulatedValue + item.Value;
            var newWeight = node.AccumulatedWeight + item.Weight;
            var remainingCapacity = _capacity - newWeight;

            var rest = ksItems.Skip(1).ToArray();

            //if i was able to add something
            if (remainingCapacity >= 0)
            {
                var newNode = new KnapsackNode(newValue, newWeight);
                newNode.SelectedItems.AddRange(node.SelectedItems);
                newNode.SelectedItems.Add(item.Id);

                if (remainingCapacity > 0) BuildTree(newNode, rest);
                if (newNode.AccumulatedValue > _bestNode.AccumulatedValue) _bestNode = newNode;
            }

            //this is to use first node but not adding current item
            if (rest.Any(k => k.Weight + node.AccumulatedWeight <= _capacity) && (rest.Sum(k => k.Value) + node.AccumulatedValue) > _bestNode.AccumulatedValue)
            {
                BuildTree(node, rest);
            }
        }