补充,上次链家笔试的0-1背包问题
2017-09-05 13:18
127 查看
上次同学链家笔试,有一道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;
}
}
}
问题:明明和乔乔一起逃亡,要求输入第一行,第一个数表示输入几行数据,第二个数表示背包的容量,接下来的几行第一个数表示该物品的个数,第二个数表示物品的重量,第三个数表示物品的价值。求,在背包容量的限度内,能装多少价值的物品?
例: 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; }