您的位置:首页 > 其它

补充,上次链家笔试的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;
}
}
}
//一下代码为寻找路径,和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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: