超大背包问题 折半枚举

超大背包问题:有重量和价值分别为wi,vi的n个物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值。

1<n<40

1<wi,vi<10^15

1<W<10^15

因为wi,太大,数组开不了,而我们发现n的数量较少,可以使用折半枚举。

 

首先枚举前n/2个背包的所有可能结果,储存在结构体ps[N].sv  ps[N].sw中,然后按sw排序,从小到大,剔除掉其中满足(ps[i].sw>ps[j].sw&&ps[i].sv<ps[j].sv)的元素。(为了可以使用后面的二分查找)

然后枚举后面n/2个背包组合的所有可能,算出其sv,sw,然后从上面的结构体中二分查找 找出符合ps[q].sw<=W-sw时,最大的q,这时ps[q].sv是满足W-sw重量中的最大价值。总的价值就是ps[q].sv+sv.

#include<stdio.h>
struct node
{
	int sw,sv;
}ps[100];
void qsort(struct node a[],int l,int r);//快速排序
int binary_find(const struct node a[],int l,int r,int x)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值