0-1背包的意外答案

时间:2015-06-19 13:13:33

标签: c++ algorithm

我的0-1背包代码:

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

int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    string s;
    int N,W;

    getline(cin,s);
    stringstream(s)>>N>>W;

    cout<<"Enter value and weight of item\n";
    int v[N+1],w[N+1];

    for(int i=1;i<=N;i++)
    {
        getline(cin,s);
        stringstream(s)>>v[i]>>w[i];
    }
    int max_val[N+1][W+1];
    for(int i=0;i<=W;i++)
    {
        for(int j=0;j<=N;j++)
        {
            if(i==0 || j==0)
            {
                max_val[i][j]=0;
            }
            else
            {
                max_val[i][j]=max_val[i][j-1];
                if(w[j]<=i)
                {
                    max_val[i][j]=max(max_val[i][j],max_val[i-w[j]][j-1]+v[j]);
                }
            }
            cout<<max_val[i][j]<<" ";
        }
        cout<<"\n";
    }
    cout<<max_val[W][N];
}

输入:

3 5  
60 1  
100 2  
120 3  

MAX_VAL:

0 0 0 0   
0 60 60 60   
0 60 100 100   
0 60 160 160   
0 60 160 180   
0 60 160 160   

输出为160,但预期输出为220 值矩阵为60,100,120,权重为1,2,3 当我调试时,在i = 5期间改变了权重矩阵的值,这给出了错误的答案 谁能告诉我为什么重量矩阵会被修改?

1 个答案:

答案 0 :(得分:3)

您已将max_val数组定义为int max_val[N+1][W+1],因此第一个索引是项目数,第二个索引是权重。但是,您使用相反顺序的索引:max_val[i][j]i为权重,j为项目编号。

因此,您对max_val的写入有时会超出范围,任何事情都可能发生。解决此问题的最简单方法是将max_val声明更改为int max_val[W+1][N+1]