【问题标题】:0/1 Knapsack problem using Dynamic Programming, Top-Down Approach [closed]使用动态规划,自上而下方法的 0/1 背包问题 [关闭]
【发布时间】: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。你认为如果你在一年内查看自己的代码,你仍然知道wnt 是什么意思吗?
  • 考虑在CodeReview 上显示您的代码。有很多可以改进的地方。例如,您从一个仅初始化您的存储的块开始您的代码,而这可以通过一个可读的单行代码来完成 (vector&lt;vector&lt;int&gt;&gt; t(n+1, vector&lt;int&gt;(w+1,0));)。在该块中,您在每次迭代中重新创建temp,尽管它始终相同,并且在离开它所在的范围之前调用clear,这是没有意义的。

标签: c++ stl c++17 dynamic-programming knapsack-problem


【解决方案1】:

我再次调试了我的代码,我不得不更改我在以下代码行中写错的一个变量:-

t[i][j] = max(value[i-1]+t[i-1][w-weight[i-1]], t[i-1][j]);

这里应该是:-

t[i][j] = max(value[i-1] + t[i-1][ j - weight[i-1]], t[i-1][j]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 2018-07-11
    • 1970-01-01
    • 2023-04-03
    • 2019-07-26
    • 2022-01-13
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多