【发布时间】:2016-03-30 20:01:33
【问题描述】:
所以我正在尝试实现以下伪代码,但它不会像预期的那样工作。这是幻灯片中的问题描述,“给定一个整数边界“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] - 幻灯片有错字):
这是我实现伪代码的代码:
#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;
}
感谢您的帮助!
【问题讨论】:
-
乍一看,这听起来像是bin packing problem。 (带一个垃圾箱)。
标签: c++ algorithm dynamic c++14 subset-sum