zoukankan      html  css  js  c++  java
  • 超大背包问题

    #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
    ",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

  • 相关阅读:
    Bootstrap表格的使用
    [JS练习] 瀑布流照片墙
    [C#基础] 委托
    [C#基础] 泛型
    [C#基础] 继承
    [C#基础] 类
    [C#基础] 数据类型
    Unity获取手机的电量时间
    C#网络通信Socket详解
    记C#一次服务器搭建和数据库应用
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/10033079.html
Copyright © 2011-2022 走看看