浅谈存在性背包问题
来源:互联网 发布:gps车辆监控软件 编辑:程序博客网 时间:2024/06/02 01:21
Problem
背包是动态规划中的一个十分重要的专题。于是我们就会遇到一些这样的题目,已知n件物品的体积分别为Pi,还有m个背包的容量分别为Ai。每件物品可以取任意多次,询问可以装满多少个背包。
Thoughts
这是一个比较基础的DP问题,通常的解法当然是直接套用完全背包问题的模板。其时间复杂度为O(n×maxv)。
for(int i=1;i<=n;i++) for(int v=maxv;v>=p[i];v--) f[v]=f[v]||f[v-p[i]];
哇,这题好水啊!
结果再一看数据范围。嗯…逗我呢?数组都要开到爆了!
Solution
题目果然没那么良心
那么应该怎么做呢?
KB says:
而标解的思路是极其巧妙的。我们令物品里最小价格是pmin,对于一个儿子的要求x,如果x模pmin的结果是y,而除了最小价格物品以外的其他物品凑出一个模pmin结果是y的价格z,这个价格比x小,则是x是可以凑出来的(因为x-z的部分可以通过使用pmin来完成)。
好有道理!
真是太强了%%%%
其实意思就是用其他的物品去凑出一个价格z,使得z%pmin=y,又因为x%pmin=y,即有x≡z(mod pmin)。
那么只要满足
那么,我们就可以设置一个数组dis[j],用于表示v%pmin=j时,v的最小值。对于每一个背包容量,只需要判断dis[A[i]%pmin]与A[i]的大小就可以了。
至于dis数组怎么处理呢,这个方法很巧妙——最短路!把每个体积抽象为点,然后分别在当前更新的这个体积的基础上加上其他的物体体积,更新,这样也就可以算出来了。
时间复杂度大概为O(n×pmin)
Code
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <queue>using namespace std;const int maxn=510,maxm=100010;int n,m,ans,dis[maxm],p[maxn];bool inq[maxm];queue<int> q;void spfa(){ int x,y; memset(dis,0x3f,sizeof(dis)); dis[0]=0; q.push(0); inq[0]=true; while(!q.empty()) { x=q.front(); q.pop(); inq[x]=false; for(int i=2;i<=n;i++) { y=(x+p[i])%p[1]; if(dis[y]>dis[x]+p[i]) { dis[y]=dis[x]+p[i]; if(!inq[y]) q.push(y),inq[y]=true; } } }}int main(){ int x; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&p[i]); sort(p+1,p+n+1); spfa(); for(int i=1;i<=m;i++) { scanf("%d",&x); if(dis[x%p[1]]<=x) ans++; } printf("%d\n",ans); return 0;}
阅读全文
0 0
- 浅谈存在性背包问题
- 浅谈树形背包问题
- 动态规划:01背包问题的浅谈
- BZOJ 3207 浅谈主席树及哈希表对于区间数列存在性判断问题的应用
- 01背包问题存在最优子结构的证明
- hdu 2639 01 背包 存在k 个多解问题
- 浅谈视频解析目前存在的问题及解决方法
- BZOJ 4145 浅谈状态压缩动态规划背包问题
- 浅谈存在与信念
- 浅谈动规贪心 与0-1背包和分数背包问题
- 浅谈多重背包
- 浅谈分组背包
- 存在问题
- 浅谈一下我所看到的独立游戏存在的问题---文/疯王子
- 【无限背包】背包问题
- 背包问题---01背包
- 背包问题--部分背包
- 浅谈01背包和完全背包
- C++笔记——默认参数的函数
- 218. The Skyline Problem
- VS2015添加自动头部注释
- AngularJS 内置服务 ~ $http().then()
- 【QT】笔记(二)
- 浅谈存在性背包问题
- [C语言]编译器是不是帮我们优化了乘或除以用2^x表示数的指令?
- 13-StringBuffer类的概述/数组冒泡/二分查找/Arrays类/Integer类
- 【Python-3.5】win7安装Pygame
- 第七周项目2 建立链队算法库
- ccf 折点计数
- 读者-写者问题(三种实现方案)
- padding oracle attack相关之padding oracle attack
- 10.13笔记shell和const