【发布时间】:2021-11-10 08:16:14
【问题描述】:
大家好,我正在尝试使用动态规划自顶向下方法解决 0/1 背包问题。我很确定我的大部分逻辑都是正确的,我的代码正在成功编译。但是,它没有提供所需的正确/正确的输出。 例如,假设 weight[] 的输入为 10,20,30,其对应的 value[] 为 60,100,120。背包可以承受的最大重量是 50。最大利润应该是 220,但我的代码给我的答案是 280。请帮助我,这是我的一段代码:-
#include<bits/stdc++.h>
using namespace std;
void knapsack(vector<int>& weight, vector<int>& value, int w, int n){
vector<vector<int>> t;
for(int i=0;i<n+1;++i){
vector<int> temp;
for(int j=0;j<w+1;++j){
int x =0;
temp.push_back(x);
}
t.push_back(temp);
temp.clear();
}
for(int i=1;i<n+1;++i){
for(int j=1;j<w+1;++j){
if(weight[i-1]<=w){
t[i][j] = max(value[i-1]+t[i-1][w-weight[i-1]], t[i-1][j]);
}
else{
t[i][j] = t[i-1][j];
}
}
}
cout<<"Max Profit: "<<t[n][w];
// return final;
// vector<int> oneDimVector;
// for(int i = 0; i < n+1; i++){
// for(int j = 0; j < w+1; j++){
// oneDimVector.push_back(t[i][j]);
// }
// }
// vector<int>::iterator maxElement;
// maxElement = max_element(oneDimVector.begin(), oneDimVector.end());
// cout<<"Max Profit: "<<*maxElement;
}
int main(){
int n;
int w;//Total weight of knapsack
cin>>n;
cin>>w;
vector<int> weight;
vector<int> value;
for(int i=0;i<n;++i){
int x;
cin>>x;
weight.push_back(x);
}
for(int i=0;i<n;++i){
int x;
cin>>x;
value.push_back(x);
}
knapsack(weight,value,w,n);
}
【问题讨论】:
-
请不要使用所谓的“竞赛”或“在线评判”网站来学习 C++ 或编程。这不是此类网站的目的。他们所教的似乎都是非常坏的习惯,而且习惯(好的和坏的)往往会坚持下去,所以学习和使用坏的习惯会导致糟糕的代码。投资some good C++ books 并上课。
-
请先尝试调试您的代码,然后再询问它有什么问题。 调试我的代码类型的问题对其他人和你都没有用。
-
我建议您给变量起更好的名称或添加一些 cmets。你认为如果你在一年内查看自己的代码,你仍然知道
w、n或t是什么意思吗? -
考虑在CodeReview 上显示您的代码。有很多可以改进的地方。例如,您从一个仅初始化您的存储的块开始您的代码,而这可以通过一个可读的单行代码来完成 (
vector<vector<int>> t(n+1, vector<int>(w+1,0));)。在该块中,您在每次迭代中重新创建temp,尽管它始终相同,并且在离开它所在的范围之前调用clear,这是没有意义的。
标签: c++ stl c++17 dynamic-programming knapsack-problem