Knapsack solution with Backtraking in c++

前端 未结 1 542
感情败类
感情败类 2021-01-27 22:36

Im having troubles trying to resolve the Knapsack problem using backtraking.

For example, for the following values, the Knapsack function will return 14 as the solution,

1条回答
  •  孤独总比滥情好
    2021-01-27 23:22

    #include
    #include
    
    using namespace std;
    
    int weights[] = {2, 3, 1}, values[] = {6, 15, 7};
    
    int solution = 0, n = 3;
    
    std::vector vsol;
    std::vector temp;
    
    bool issol;
    
    
    void Knapsack (int i, int max, int value)
    {
      for (int k = i; k < n; k++) {
        if ( max > 0)
        {
            if (weights[k] <= max)
            {
              temp.push_back(k);
              if (value+ values[k] >= solution)
              {
                solution = value + values[k];
                issol = true;
              }
            }
            if ( (k+1) < n)
            {
              Knapsack (k+1, max - weights[k], value + values[k]);
            }
            else
            {
              if (issol == true)
              {
                if (! vsol.empty()) vsol.clear();
                std::move(temp.begin(), temp.end(), std::back_inserter(vsol));
                temp.clear();
                issol = false;
              } else temp.clear();
              return;
            }
        }
        else
        {
            if (issol == true)
            {
                if (! vsol.empty()) vsol.clear();
                std::move(temp.begin(), temp.end(), std::back_inserter(vsol));
                temp.clear();
                issol = false;
            } else temp.clear();
            return;
        }
      }
    }
    
    int main()
    {
        Knapsack(0, 2, 0);
        cout << "solution: " << solution << endl;
        for(vector::iterator it = vsol.begin(); it != vsol.end(); it++)
            cout << *it << " ";
        return 0;
    }
    

    You need to increase k by 1 when you call the Knapsack function again to move the index forward.

    Added code to print out index locations of the solution. If more than one solution exists (i.e. same total), will only print out the locations for the last solution.

    0 讨论(0)
提交回复
热议问题