超大背包问题:有重量和价值分别为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)