背包问题贪心法可解的证明

背包问题贪心法可解的证明

0.问题描述

给定一个背包,容积为c,给定n个物品{1,2……n},以及每个物品的价值vi ,体积wi,每个物品不一定要全部放入,可以是物品的一部分。求可以放入背包的物品最大价值。

 

1.问题分析

求一个最优的物品的集合E., 即求max{∑vj}  (jE, ∑wj≤c)

①最优子结构性质: 原问题的物品集合为S,设原问题的一个最优解E(选择的物品组成的集合),E集合中一个物品是A,那么E-{A}是S-{A}在容量为C - V(A)下的最优解

1

证明:

①假设规模为n的问题有最优解E,E-{A}的不是S-{A}规模中最优的解:即存在Value(E') > Value(E),

那么Value(S) = Value(E) + Value(A) < Value(E') + Value(A) 因此S不是原问题的最优解,与假设矛盾。

 

②贪心选择性质:

特点:物品可以加入一部分。

分析:可以一份一份地考虑,这个时候我们欲先将单位重量价值最大地装上。

证明:

①假设原问题有一个最优E,它不是按照贪心选择开始的。E中放入的第一个单位重量的物品是A,  由假设可知A不是单位重量价值最大的。

② 假设在S-E中有一个单位重量的物品B,value\left (B\right ) >value\left (A \right ), 令 E{'}= E - \left \{ A\right \} \cup \left \{ B\right \}  ∴ value\left (E{'} \right ) >value(E) ,因为E是一个最优解,因此S-E中不存在这样的B,假设不成立。

③假设E中另外一个单位重量的物品C,value\left (C \right ) >value\left (A \right ),交换A,B的放入顺序,得到一个方案E'', 因为E''中的物品和E中的一致,只是放入的顺序不同,所以E''是原问题的一个最优解。

③通过每一步的贪心可以得到最优解。

①|E| = 1时,放入的第一单位物品时单位重量价值最大的,由贪心选择性质可知,成立。

②假设当|E|=k时成立。即放入的第k单位物品是剩下物品中单位重量价值最大的。

③当|E|=k+1时:

  • 贪心选择性质,剩下物品中第一个放入单位重量价值最大的物品可以得到S - {1,2……k} 最优解。
  • 最优子结构性质,E - {1,2,……k} 是 S - {1,2……k}的最优解。因此放入第k+1个物品时,选择剩下物品中单位重量价值最大的,可以得到最优解。

综上,假设成立,通过每一步的贪心可以得到整体最优解。

3.算法流程:

1

代码:

struct PerW{
	double perw;
	int w;
	int v;
};
bool cmp(PerW p1, PerW p2){
	return p1.perw>p2.perw;
}
int GreedyPack(int n,int c,PerW* per){
	PerW p;
	int i,result=0;
	sort(per,per+n,cmp);
	i=0;
	while(c>0&&i<n){
		p=per[i++];
		if(c>p.w) result+=p.v;
		else{
			result+=(p.perw*c);break;
		}
		c-=p.w;
	}
	return result;
}

 

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hnu哈哈

请接受直女的么么哒????

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值