我的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期间改变了权重矩阵的值,这给出了错误的答案 谁能告诉我为什么重量矩阵会被修改?
答案 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]
。