Рюкзак - алгоритм перебора

Я нашел этот код для решения проблемы рюкзака, используя механизм грубой силы (это в основном для обучения, поэтому не нужно указывать, что динамика более эффективна). Я получил код для работы, и понимаю большинство из них. САМЫЙ. Вот вопрос:

Я заметил эти два условия: я понятия не имею, как они работают и почему они находятся в коде - я знаю, что они жизненно важны, поскольку любые внесенные мной изменения приводили к тому, что алгоритм давал неправильные результаты:

// if bit not included then skip
if (((i >> j) & 1) != 1) continue;

// if bit match then add
if (((bestPosition >> j) & 1) == 1)
{
    include.Add(Items[j]);
}

Вот весь класс и то, как я его называю из основного:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KnapSack2
{
    class BruteForce
    {
        public double Capacity { get; set; }
        public Item[] Items { get; set; }

        public Data Run()
        {
            int bestValue = 0;
            int bestPosition = 0;
            int size = Items.Length;

            var permutations = (long)Math.Pow(2,size);

            for (int i = 0; i<permutations; i++)
            {
                int total = 0;
                int weight = 0;
                for (int j = 0; j<size; j++)
                {
                    //jeżeli bit "not included" to omin"
                    if(((i>>j)&1)!=1)
                        continue;
                    total += Items[j].v;
                    weight += Items[j].w;
                }
                if (weight <= Capacity && total>bestValue)
                {
                    bestPosition = i;
                    bestValue = total;
                }
            }
            var include = new List<Item>();
            for (int j = 0; j<size; j++)
            {
                // jeżeli bit pasuje, wtedy dodaj
                if (((bestPosition>>j) & 1)==1)
                    include.Add(Items[j]);
            }
            return new Data { BestValue = bestValue, Include = include };

        }//End of Run


    }
}

Вызов в основном

var ks = new BruteForce
{
    Capacity = MaxWeight,
    Items = items.ToArray()
};

Data result = ks.Run();

Класс предметов - это просто простой объект, имеющий значение, вес и идентификатор

Ответы на вопрос(2)

Ваш ответ на вопрос