问题描述
有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且具有最大的价值。
并对下表所示的4个物品求出W=6时的所有解和最佳解。

问题求解
对于n个物品、容量为W的背包问题,采用前面求幂集的方法求出所有的物品组合。
对于每一种组合,计算其总重量sumw和总价值sumv,当sumw小于等于W时,该组合是一种解,并通过比较将最佳方案保存在maxsumw和maxsumv中,最后输出所有的解和最佳解。
代码
vector<vector<int>> ps;//存放幂集
void PSet(int n)
{
vector<vector<int>> ps1;//存放子幂集
vector<vector<int>>::iterator it;
vector<int> s;
ps.push_back(s);
for (int i = 1; i <= n; i++)
{
ps1 = ps;
for (it = ps1.begin(); it != ps1.end(); it++)
(*it).push_back(i);
for (it = ps1.begin(); it != ps1.end(); it++)
ps.push_back(*it);
}
}
void Knap(int w[], int v[], int W)
{
int count = 0;
int sumw, sumv;
int maxi, maxsumw = 0, maxsumv = 0;
vector<vector<int>>::iterator it;//幂集迭代器
vector<int>::iterator sit;//幂集集合元素迭代器
for (it = ps.begin(); it != ps.end(); it++)
{
sumw = sumv = 0;
for (sit = (*it).begin(); sit != (*it).end(); sit++)
{
sumw += w[*sit - 1];
sumv += v[*sit - 1];
}
if (sumw <= W)//总重量满足题目要求
{
if (sumv > maxsumv)
{
maxsumv = sumv;
maxsumw = sumw;
maxi = count;
}
}
count++;
}
cout << "最佳方案为:选中物品:";
for (sit = ps[maxi].begin(); sit != ps[maxi].end(); sit++)
cout << *sit << " ";
cout << "总价值为" << maxsumv << " 总重量为" << maxsumw;
}
761

被折叠的 条评论
为什么被折叠?



