上次同学链家笔试,有一道0-1背包的问题不会做,当时百度了一下,没看太懂,今天来补充一下自己做的代码:
问题:明明和乔乔一起逃亡,要求输入第一行,第一个数表示输入几行数据,第二个数表示背包的容量,接下来的几行第一个数表示该物品的个数,第二个数表示物品的重量,第三个数表示物品的价值。求,在背包容量的限度内,能装多少价值的物品?
例: 2 10
3 4 3
2 2 5
输出: 13
int Dp(vector<int> &weight,vector<int> &value,int num,int maxweight)
{
vector<vector<int> > end(num+1);
for(int i = 0; i <= num; ++i)
end[i].resize(maxweight+1);
cout<<num<<" "<<maxweight<<endl;
for(int i = 1; i <= num; ++i)
{
end[i][0] = 0;
for(int j = 1; j <= maxweight; ++j)
{ //如果表示重量的下标比该物品的重量下,则和之前的数据相同
if(j < weight[i-1])
end[i][j] = end[i-1][j];
else
{ //否则将计算,之前重量的背包所能容量的价值和不装该物品的价值的最大值
int tmp = end[i-1][j - weight[i-1]] + value[i-1];
if(tmp < end[i-1][j])
end[i][j] = end[i-1][j];
else
end[i][j] = tmp;
}
}
}
//一下代码为寻找路径,和0-1背包的实质计算没有关系。
//vector<int> path(num+1);
//for(int i = num,j = maxweight; i > 0; --i)
//{
// if(end[i][j] == end[i-1][j])
// path[i] = 0;
// else
// {
// path[i] = 1;
// j -= weight[i-1];
// }
//}
//copy(path.begin(),path.end(),ostream_iterator<int>(cout," "));
return end[num][maxweight];
}
void main()
{
int num,maxweight;
cin>>num>>maxweight;
int tmp = 0;
vector<int> weight;
vector<int> value;
for(int i = 0; i < num; ++i)
{
int tmp_tmp;
cin>>tmp_tmp;
tmp += tmp_tmp;
int tmp_tmp_tmp;
cin>>tmp_tmp_tmp;
for(int j = 0; j < tmp_tmp; ++j)
{
weight.push_back(tmp_tmp_tmp);
}
cin>>tmp_tmp_tmp;
for(int j = 0; j < tmp_tmp; ++j)
value.push_back(tmp_tmp_tmp);
}
cout<<Dp(weight,value,tmp,maxweight)<<endl;
}