无法实现Subset Sum的伪代码

时间:2016-03-30 20:01:34

标签: c++ algorithm dynamic c++14 subset-sum

所以我试图实现以下伪代码,但它不会像预期的那样工作。下面是幻灯片中的问题描述,"给定一个整数绑定," W"以及" n"的集合。每个项目都有一个正整数权重" wi",找到项目的子集S:最大化Sigma sub i,其中i是S" wi"保持这个总和小于或等于或W.我将附上以下幻灯片,我从哪里得到问题描述和伪代码。我实现的问题是它只能找到总的最大值而不是小于或等于权重的值。因此,例如,如果我有权重10(W = 10)和项目3(n = 3),项目权重1,4和& 8那么下面的答案应该是9;但是,我的解决方案给出了12个。这是幻灯片(*请不要,在哪里说w [j]它的意思是w [i] - 幻灯片有错字):

enter image description here

enter image description here

这是我实现伪代码的代码:

#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int max(int a, int b, int c) {
             if (a >= b)
                return a;
             else
                return b;       
          }

int optimal_weight(int W, const vector<int> &wt, int n){
    vector<vector<int> > M;
    M.resize(n+1);
    for(int i = 0; i < n+1; ++i){
        M[i].resize(W+1);
    }
    for(int w = 0; w < W+1; w++){
        M[0][w] = 0;
    }
    for(int i = 1; i < n+1; i++){
        M[i][0] = 0;
    }

for(int i = 1; i < n+1; i++){
    for(int w = 0; w < W+1; w++){
        if(wt[i] > w){
            M[i][w] = M[i-1][w];
        }

        M[i][w] = max(M[i-1][w], wt[i] + M[i-1][W-wt[i]], W);
    }
}



   for (int i = 0; i <= n; i++)
     {
       for (int j = 0; j <= W; j++)
          printf ("%4d", M[i][j]);
       printf("\n");
     } 

    return M[n][W];
} 

int main()
{
    //int val[] = {1, 1, 1};
    int W;
    int n;
    cin >> W >> n;
    vector<int> wt(n);
    for(int i = 0; i < n; i++){
        cin >> wt[i];
    }
    cout << optimal_weight(W, wt, n) << endl;

}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我明白了!这是我的解决方案:

#include <iostream>
#include <vector>
using namespace std;

using std::vector;

int optimal_weight(int W, const vector<int> &wt) {
  //write your code here

  int n = wt.size();
  vector<vector<int> > matrix;
  matrix.resize(W+1);
for(int i = 0; i < W+1; i++){
    matrix[i].resize(n);
}
  for(int j = 0; j < n; j++){
      matrix[0][j] = 0;
  }
    for(int w = 0; w < W + 1; w++){
      matrix[w][0] = 0;
  }
  for(int i = 1; i < n; i++){
      for(int w = 1; w < W+1; w++){
          matrix[w][i] = matrix[w][i-1];
          if(wt[i] <= w){
              //cout << wt[i] << endl;
              int val = matrix[w-wt[i]][i-1] + wt[i];
              if(matrix[w][i] < val){
                  matrix[w][i] = val;
              }
          }
      }
  }

  return matrix[W][n-1];


}

int main() {
  int n, W;
  std::cin >> W >> n;
  vector<int> wt(n+1);
  for (int i = 1; i < n+1; i++) {
      wt[0]=0;
    std::cin >> wt[i];
  }
  std::cout << optimal_weight(W, wt) << '\n';
}