超大的变体背包问题(折半枚举/双向搜索)
来源:互联网 发布:mysql默认配置文件 编辑:程序博客网 时间:2024/05/26 12:54
来源:挑战程序设计竞赛p162
最近又遇到了这个问题 来总结一下好了 算是补档吧。。。
问题?
有
N 件物品和一个容量为W 的背包。第i件物品的费用是wi ,价值是vi 。求解在刚好为m 的重量下,最多可选几个物品?
范围
1≤n≤40
wi,vi≤109
这样明显不能用普通动态规划了吧。。。。数组开不下,我们考虑枚举。枚举自然会tle,于是我们考虑将背包分为2部分:前一半物品和后一半物品。
用列举子集的形式来写会很好,但是要注意从0开始计数。。。
注意一个优化,用m去优化占的位置多又价值不高的品种。
注意lower_bound最后返回的结果-1,因为查找值的second是
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <queue>#include <map>//ACusing namespace std;const int maxn=45;const int maxm=1000000100;const int inf=0x3f3f3f3f;int n,m;int w[maxn];pair<int ,int > ans[1<<(maxn/2)];int main(){ freopen("candy.in","r",stdin); freopen("candy.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&w[i]); } int s=n/2; for(int z=0;z<(1<<(s));z++) { int val=0; int cnt=0; for(int i=1;i<=s;i++) { if((z>>(i-1))&1) { cnt++; val+=w[i]; } } ans[z]=make_pair(val,cnt); } sort(ans,ans+(1<<s)); //[去掉多余]的这个优化要不要都不影响答案 int tag=1; for(int i=1;i<(1<<s);i++)//去掉多余 { if(ans[tag-1].second<ans[i].second) { ans[tag]=ans[i]; tag++; } } int res=0; for(int i=0;i<(1<<(n-s));i++) { int val=0; int cnt=0; for(int j=1;j<=n-s;j++) { if(i>>(j-1)&1) { val+=w[j+s]; cnt++; } } if(val<=m) { pair<int ,int> best=*(lower_bound(ans,ans+(1<<s),make_pair(m-val,inf))-1); if(val+(best.first)==m) res=max(res,(best.second)+cnt); } } if(res>0) printf("%d\n",res); else printf("Impossible\n"); return 0;}
QAQ
0 0
- 超大的变体背包问题(折半枚举/双向搜索)
- 超大背包问题 (折半枚举)
- 超大背包问题(折半枚举)
- 超大背包问题 (折半枚举)
- 超大背包问题 折半枚举
- 超大背包问题 折半枚举法
- ZOJ 3631超大背包问题(DFS || 折半搜索)
- 折半枚举(双向搜索)
- 折半枚举(双向搜索)
- 162_超大背包问题 (双向搜索)
- Poj 3977 Subset 折半枚举 超大背包
- 超大背包问题(枚举二分)
- 哗啦啦族的01背包问题(折半枚举)
- 折半枚举(双向搜索)挑战程序设计竞赛
- codeforces 888E Maximum Subsequence (折半枚举 双向搜索)
- 160_折半枚举(双向搜索) 4 Values whose sum is 0 (POJ No.2785)
- POJ 2785 4 Values whose Sum is 0 折半枚举(双向搜索)
- 折半枚举(双向搜索)poj27854 Values whose Sum is 0
- Python编程:从入门到实践读书笔记-5 if语句
- [转载][Unity插件]DOTween基础
- 内核态(Kernel Mode)与用户态(User Mode)
- thinking in java——0323学习笔记
- HDU 1969 Pie
- 超大的变体背包问题(折半枚举/双向搜索)
- 树莓派初次使用(史上最全最详细教程!!)
- 安装wamp测试端口时出现 your port 80 is not actually used
- 合法分数的组合
- 170323 PyQt5 ListWidget的删除
- RTSP/RTP/RTCP学习
- 树莓派.config的提取和NFS的安装
- 剑指offer-二叉树的深度-php
- qsort用法--完整版(解释了cmp)【转】