分数背包问题(贪心问题)

与01背包不同的是,

背包容量C、物品体积V、物品价值S

正实数,不是正整数

且允许每种物品的一部分装入背包

求总价值最大:

物品 u 1 , u 2 , u 3 u_1,u_2,u_3 u1u2u3
体积 18 , 15 , 10 18,15,10 181510
价值 25 , 24 , 15 25,24,15 252415

将物品的性价比进行排序,性价比 = 价值 / 体积

性价比: u 2 = 1.6 , u 3 = 1.5 , u 1 = 1.38 u_2 = 1.6,u_3 = 1.5,u_1 = 1.38 u2=1.6u3=1.5u1=1.38

按照单位体积从大到小的顺序选择物品装入背包

伪代码!!!
具体问题具体分析!!!

bool cmp(int a, int b)
{
	return b > a;
}

int fun(int v[], int s[], int n, int C)
{
	int y[n+1];
	for(int i=1; i<=n; i++) // 求出性价比
		y[i] = v[i]/s[i];

	sort(y+1, y+1+n, cmp); // 性价比从大到小排序

	int c = C;
	int i = 1;
	int M = 0; //记录最大价值 
	while(c>0 && i<=n)
	{
		if(y[i] <= rc) x[j]=1,rc-=s[i];
		else x[j] = rc/s[j],rc=0;
		M += v[j]*x[j];
	}
	return x,maxn;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值