贪心算法解背包问题

背包问题与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。

背包问题与0-1背包问题都具有最优子结构性质,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。

1、贪心策略

首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包;若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。

算法步骤:1)排序;2)扫描判断如何装

2、贪心算法

public static float knapsack(float c,float[] w, float[] v,float[] x){
	int n=v.length;
	Element [] d = new Element [n];  //物品数组
	for (int i = 0; i < n; i++)     //数组初始化
	    d[i] = new Element(w[i],v[i],i);
	MergeSort.mergeSort(d);  //物品按照单位价值排序
	int i;
	float opt=0;    //当前装入背包的价值
	for (i=0;i<n;i++) 
	    x[i]=0;
	for (i=0;i<n;i++) {  //扫描物品
	    if (d[i].w>c)    //d[i].w表示扫描到第i个物品时取出其重量
	        break;       //物品i装不下时跳出
	    x[d[i].i]=1;    //物品i装入背包
	    opt+=d[i].v;
	    c-=d[i].w;   //背包当前容量
	}
	if (i<n){   //背包未装满还有剩余物品时
	    x[d[i].i]=c/d[i].w;   //装入部分物品i
	    opt+=x[d[i].i]*d[i].v;
	}
	return opt;
}

算法时间分析:算法knapsack的主要计算时间在于将各种物品依其单位重量的价值从大到小排序。因此,算法的计算时间上界为O(nlogn)。 

3、贪心选择策略不适用0-1

对于0-1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用动态规划算法求解的另一重要特征

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值