当背包问题的w和v都巨大时,时间复杂度和空间复杂度都不能满足要求,只能利用双向搜索的方法来求解:

首先将数组分成量部分,对第一部分用位操作的方法来枚举所有的子集的w和v(和),然后排序,去重(去除那些明显不可能的解)

然后对第二部分进行同样的枚举操作,从而找到重量不超过的情况下,价值的最大值。

需要注意的是lower_bound函数的问题,在比较pair类型的元素时,first和second都会进行比较,导致会有一些小问题出现。

个人比较倾向于使用upper_bound(ps, ps+m make_pair(W-sw,INF))-1 的方式来实现。

//
//  162_large nk.cpp
//  changlle
//
//  Created by user on 1/10/16.
//  Copyright (c) 2016 user. All rights reserved.
//#include <iostream>
using namespace std;typedef long long ll;
const ll INF=1000;int n=4;
ll w[4]={2,1,3,2};
ll v[4]={3,2,4,2};
ll W=5;pair<ll, ll> ps[1<<(20/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];// amazing!!!for (int i=0;i<(1<<n2);i++) {cout<<ps[i].first<<" "<<ps[i].second<<endl;}ll res=0;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=(upper_bound(ps,ps+m,make_pair(W-sw,INF))-1)->second;//此处注意pair在lower_bound 和 upper_bound中的小问题~res=max(res,sv+tv);}}cout<<res<<endl;
}int main() {solve();cout<<endl;//    pair<int,int> b[4]={ make_pair(1,1),make_pair(2,2),make_pair(3,3),make_pair(4,4)};
//
//    cout<<(lower_bound(b,b+3,make_pair(5,5)))->second<<endl;//fuck~~keng
//    return 0;
}

162_超大背包问题 (双向搜索)相关推荐

  1. 超大背包问题(二进制枚举 + 二分)

    超大背包问题 第一次看到这一题好像是在某一场比赛,就是给你一个炸空间和时间的背包,让你选最大的价值,看似是01背包然鹅今天在挑战程序设计这本书上看到了这题,看到了作者的做法,感觉豁然开朗,直接暴搜也会 ...

  2. MangataのACM模板

    文章目录 数据结构 并查集 树状数组 二维单点修改,区间查询 二维区间修改,单点查询 二维区间修改,区间查询 线段树 单点修改,区间查询 区间更新.区间查询 主席树(区间第k小数模板) 单调栈 单调队 ...

  3. 几种做题时的思考方法

    目录 二分答案(最大化平均值) 反转(开关问题) 弹性碰撞 折半枚举 二分答案(最大化平均值) POJ3111 有n个物品的重量与价值分别为 w i w_i wi​和 v i v_i vi​.从中选出 ...

  4. 再探深搜之剪枝、迭代加深及双向搜索

    一.剪枝 剪枝的基本方法: 1.优化搜索顺序 2.排除等效冗余 3.可行性剪枝(上下界剪枝) 4.最优性剪枝 例题1:AcWing 167.木棒 这题首先很容易想出暴力的代码:从小到大枚举木棍总长度的 ...

  5. ACM1881 01背包问题应用

    01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: 1 # ...

  6. 算法设计与分析第4章 动态规划(一)【背包问题】

    第3章动态规划(一)[背包问题] 基本思想: 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的.不同子问题的数目常常只有多项式量级.在用 ...

  7. PHP实时生成并下载超大数据量的EXCEL文件

    最近接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况.而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成 ...

  8. c语言-01背包问题

    01背包问题 问题:有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 分析: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选 ...

  9. 2020年中国AI算力报告发布:超大算法模型挑战之下,公共AI算力基建是关键

    随着人工智能算法突飞猛进的发展,越来越多的模型训练需要巨量的算力支撑才能快速有效地实施.目前,如AlphaFold.GPT-3等模型已经逼近人工智能的算力极限,GPT-3的模型尺寸增大到了1750亿, ...

  10. 如何在高精度下求解亿级变量背包问题?

    导读:国际顶级会议WWW2020将于4月20日至24日举行.始于1994年的WWW会议,主要讨论有关Web的发展,其相关技术的标准化以及这些技术对社会和文化的影响,每年有大批的学者.研究人员.技术专家 ...

最新文章

  1. 构造函数(constructor)与原型链(prototype)关系
  2. 今日头条字节跳动抖音小程序上线前后的搜索优化配置
  3. 大二上期计算机试题答案,2019年对口升学班上期期末计算机网络技术试卷及答案知识讲解.doc...
  4. KubeDL 加入 CNCF Sandbox,加速 AI 产业云原生化
  5. 面向对象编程思想-观察者模式
  6. 学 Win32 汇编[6]: 伪指令 DUP 与数组
  7. aop日志(记录方法调用日志)
  8. 一般毕业论文的查重要求有哪些?
  9. Scratch作品(一)
  10. 推荐几款地图软件,你家的老房子都能看得一清二楚
  11. MySQL学习笔记①_案例记录
  12. 赛特斯艰难上市,“软件定义通信”的路并不好走
  13. android adb 模拟长按,adb 模拟长按电源键
  14. Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
  15. 智能交通 路侧智能感知 应用层数据格式
  16. matlab 画多边形,[转载]matlab多边形绘制
  17. 阿里云1核1G内存1M宽带可以支持多少IP访问量?
  18. Android:动态使用权限(一)
  19. 原码、补数、补码以及计算机中为什么用补码存储
  20. openofdm中complex_to_mag的分析

热门文章

  1. AutoCAD 2006网络版授权文件配置
  2. 【JavaScript】7_代码块 + if-else语句
  3. 洛谷P5200 [USACO19JAN]Sleepy Cow Sorting G(树状数组)
  4. 数据库--关系数据库重点知识总结(一)
  5. 用 Python 开发实用程序 – 计算器
  6. 提高二维矢量绘图效率之一般做法
  7. Python绘制高斯分布图像
  8. 【即将截止申报】五大年度榜单颁奖+产业图谱+行业报告,2020年度金猿策划活动正式开启...
  9. 学好python的技巧_Python学习技巧有哪些?
  10. 在中国做了三年企业级 SaaS 的几点心得