【贪心法】求解背包问题

问题描述

  有3个物品,其重量分别是{20, 30, 10},价值分别为{60, 120, 50},背包的容量为50,应用三种贪心策略装入背包的物品和获得的价值如图所示,至少有三种看似合理的贪心策略,,选一种贪心策略计算可以装入背包的物品的最大价值。
(1)选择价值最大的物品,因为这可以尽可能快地增加背包的总价值。但是,虽然每一步选择获得了背包价值的极大增长,但背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。
(2)选择重量最轻的物品,因为这可以装入尽可能多的物品,从而增加背包的总价值。但是,虽然每一步选择使背包的容量消耗得慢了,但背包的价值却没能保证迅速增长,从而不能保证目标函数达到最大。
(3)选择单位重量价值最大的物品,在背包价值增长和背包容量消耗两者之间寻找平衡。
在这里插入图片描述

求解思路

设xi表示物品i装入背包的情况,根据问题的要求,有如下约束条件和目标函数:
在这里插入图片描述
  应用第三种贪心策略,每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量,然后我们就面临了一个最优子问题——它同样是背包问题,只不过背包容量减少了,物品集合减少了。因此背包问题具有最优子结构性质。

代码实现

#include<iostream>
#include<algorithm>
using namespace std;

struct tanxinbeibao
{
   
	int id;
	int weight;
	int value;
	double ratio;
};

bool Itemcmp(tanxinbeibao item1, tanxinbeibao item2){
   
	return item1.ratio > item2.ratio;
}
int tanxinn;
int tanxinc;

double KnapSa
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值