算法分析与设计(贪心算法求背包问题)

文章讲述了如何通过贪心策略设计算法解决背包问题,其中物品按单位价值/重量选择,优先级最高。给出的示例中,物品(2,4,5,6)的最优装载方案是第一件全选,第三件选两个单位,第四件全选,总价值为12。
摘要由CSDN通过智能技术生成

问题描述:
1.设有一个载重量为10的背包,现有4个可拆分物品,每个物品的重量分别为(w1,w2,w3,w4)=(2,4,5,6),它们的价值分别为(p1,p2,p3,p4)=(2,3,5,8)。试问:如何装载才能使得装入背包中的物品的总价值最大?
(1)请设计并实现一个求解该问题的贪心算法,指出所采用的贪心选择策略。
(2)求出最大收益,以及具体的装载方案。
贪心选择策略:优先依次选择性价比最高,即单位 价值/重量 的值最大的物品,若物品不能整个放下就进行相应的分割,以此装载的获得的物品总价值最大;


参考代码如下:

#include<iostream>
using namespace std;
int n = 4, m= 10;
int w[] ={2,4,5,6};
int p[]= {2,3,5,8};
struct HH{
	int wei, value;
	double performance;
	bool operator<(const HH& x)const{
		return performance >x.performance;
		}
}A[10];

int main(){
	for(int i = 0;i<n; ++i){
		A[i].wei =w[i];
		A[i].value = p[i];
		A[i].performance =1.0*p[i]/w[i];
	}
	sort(A,A+n);
	for(int i=0;i<n;++i){
		printf("w.%d value:%d performance:%.21f\n",A[i].value,A[i].performance);
	}
	dobule val = 0;
	for(int i= ;i<n;++i){
		// 如果能放下整个物品
		if(A[i].wei<= m){
			m -=A[i].wei;
			val +=A[i].value;
		}
		else //分割物品
		{
			val +=A[i].performance *m;
			m -=m;
			break; // 省去后面无用的循环
		}
}
printf("最大总价值 = %。21f\n", val);
return 0;

(2)最大收益是选择第四件,第一件整个物品以及两个重量单位的第三件物品,总价值为12.

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值