超大背包问题

 

#include<stdio.h>
#include<algorithm>
#include<iostream>
typedef unsigned long long LL;
using namespace std;
const int maxn = 40;
LL INF  = (1<<32)-1;
//const LL INF = 0xFFFFFF;
int n;
LL w[maxn],v[maxn];
LL W,res;
pair<LL,LL>ps[1<<(maxn/2)];
void solve()
{
    int n2 = n/2;
    for(int i=0;i<1<<n2;i++)
    {
        LL sw=0,sv=0;
        for(int j=0;j<n2;j++)
        {
            if(i>>j&1)
            {
                sw+=w[j];
                sv+=v[j];
            }
        }
        ps[i]=make_pair(sw,sv);
    }
    sort(ps,ps+(1<<n2));
    int m = 1;
    for(int i=1;i<1<<n2;i++)
    {
        if(ps[m-1].second<ps[i].second)
        {
            ps[m++]=ps[i];
        }
    }
    for(int i=0;i<1<<(n-n2);i++)
    {
        LL sw=0,sv=0;
        for(int j=0;j<n-n2;j++)
        {
            if(i>>j&1)
            {
                sw+=w[n2+j];
                sv+=v[n2+j]; 
            }
        }
        if(sw<=W)
        {
            LL tv = (lower_bound(ps,ps+m,make_pair(W-sw,INF))-1)->second;
            res = max(res,sv+tv);
        }
    } 
    printf("%lld\n",res);
}
int main(void)
{
    cin >> n;
    for(int i=0;i<n;i++) cin >> w[i];
    for(int i=0;i<n;i++) cin >> v[i];
    cin >> W;
    solve();
    return 0;
} 

eg.数据在为long long 时候,不能使用(1<<32)-1,因为long long 最大值为(1<<31)-1

 

posted @ 2018-11-28 16:49  最美遇见你  阅读(390)  评论(0编辑  收藏  举报