蛮力法求解0/1背包问题

问题描述

有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值