您的位置:首页 > 其它

完全背包问题 打印背包中的物品

2015-11-11 14:39 274 查看
与0/1背包问题不同的是,每个物品可以任意次放,只要小于总容量就行,这里打印装进去的物品,还打印每种物品装了多少次

代码如下:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int main(int argc, char** argv)
{
cout<<"完全背包问题"<<endl<<endl<<"输入背包总容量"<<endl;
size_t Capacity;
cin>>Capacity;
cout<<"输入物品总数目"<<endl;
size_t num;
cin>>num;
cout<<"输入物品的体积和价值"<<endl;
vector<int> vol;
vector<int> val;
int temp1,temp2;
size_t i=0,j=0;
for(i=0;i<num;++i)
{
cin>>temp1>>temp2;
vol.push_back(temp1);
val.push_back(temp2);
}
vector<int> result(Capacity+1,0);
vector<int> print(Capacity+1,-1); //输出装进去的物品
int temp;
for(i=0;i<num;++i)
{
for(j=vol[i];j<=Capacity;++j)
{
if(vol[i] <= j)
{
temp = result[j-vol[i]] + val[i];
if(temp > result[j])
{
result[j] = temp;
print[j] = i;
}
}
}
}
cout<<"最大价值为 "<<result[Capacity]<<endl;
cout<<"装进去的物品为"<<endl;
j = Capacity;
map<int,size_t> map1;
while(print[j] != -1)
{
cout<<"物品"<<print[j]+1<<" ";
map1[print[j]]++;
j -= vol[print[j]];
}
for(i=0;i<num;++i)
cout<<endl<<"物品 "<<i+1<<" 装包的数量为 "<<map1[i];
return 0;
}运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: