贪心算法---0/1部分背包问题

本文介绍了一种使用贪心算法解决部分背包问题的方法,通过计算每种物品单位重量的价值,并按价值从高到低排序,实现最大化背包内物品的总价值。

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大  
选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。 

因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解决。

首先计算每种物品单位重量的价值V/W,然后按单位重量价值从大到小进行排序,根据贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。或将这种物品全部装入背包后,背包内的物品总重量未超过背包容量,则选择单位重量价值次高的物品并尽可能多地装入背包,依此策略一直进行下去,直到背包装满为止。

代码如下:

#include<iostream>
using namespace std;

//部分背包问题,贪心算法,其中Goods第一列是物品重量,第二列是物品价值,Goods已经按照(物品价值/物品重量)进行从高到底排序

int PartBagProblem(int Goods[][2],int length,int maxvolume)
{
	int i;
	int maxvalue = 0;
	for(i = 0;i < length;i++)
	{
		//如果是重量小于可以剩余的容量,则全部要了
		if(Goods[i][0] < maxvolume)
		{
			maxvalue += Goods[i][1];
			maxvolume -=Goods[i][0];
		}
		else
			break;
	}

	if(maxvolume != 0)
	{
		maxvalue += (maxvolume * Goods[i][1])/ Goods[i][0] ;
	}

	return maxvalue;
}

int main()
{
	int Goods[][2] = {{10,60},{20,100},{30,120}};
	cout<<PartBagProblem(Goods,3,50);
	return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值