求解0/1背包问题
【问题描述】 有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为w的背包,实际从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且要具有最大的价值。
【问题求解】对于n个物品、容量为w的背包问题,采用前面求幂集的方法求出所有物品组合。
对于每一种组合,计算其总重量sumw和总价值sumv,当sumw小于w时,该组合式一种解,并通过比较将最佳方案保存在maxsumw和maxsumv中,最后输出所有解和最佳解。
代码实现:
#include<stdio.h>
#include<vector>
using namespace std;
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; //ps1存放上一步骤得到的幂集
for(it=ps1.begin();it!=ps1