loj6089 小 Y 的背包计数问题
吐槽:
好吧开学了果然忙得要死……不过为了证明我的blog还没有凉,还是跑来更一波水题
题意:
有n种物品,第i种体积为i,问装满一个大小为n的背包有多少种方案?
$n\leq 10^5.$
做法:
这种题一看就很想按根号分类是不是……
设阈值大小为$m=\sqrt n$,对于体积$\leq m$的所有物品,直接跑多重背包:
f[i][j]表示前i个物品,体积和为j的方案数,$f[i][j]=\sum f[i-1][j-ki],k\in [0,i]$。
记录sum[x]表示$\sum f[i-1][j]$其中$j\% i=x$,同时需满足当前的j和上一个状态lastj的差$\leq i^2$。这样可以把dp优化到$\mathcal{O}(n\sqrt n)$。
对于体积$>m$的所有物品,由于$i^2$一定$>n$,所以相当于完全背包:
但是当然不能直接跑完全背包,复杂度是炸的。可以发现物品的个数不超过$\sqrt n$,那么
g[i][j]表示i个物品,体积和为j的方案数(注意和f的区别),$g[i][j]=g[i][j-i]+g[i-1][j-m-1]$。
具体来说这个转移表示,要么把当前i个物品每个体积都增加1,要么插入一个体积为m+1的物品(一个构造法,恰好不重不漏地计算了所有方案)。
复杂度也是$\mathcal{O}(n\sqrt n)$。
最后把两者乘法原理合并起来即可。
题外话:51nod1259是一道类似的题,区别是它都是完全背包,更简单了些。
code:
#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define ll long long
using namespace std;
#define N 100005
const int mod=;
int n,m,f[][N],sum[N],g[][N],now,t,ans;
void upd(int &x,int y){x+=y;x-=x>=mod?mod:;}
int main(){
cin>>n;m=sqrt(n);now=;f[][]=;
rep (i,,m){//f[i][j]:前i个体积<=m的物品,体积和为j的方案数
now^=;memset(sum,,sizeof(sum));
rep (j,,n){
upd(f[now][j]=f[now^][j],sum[j%i]);upd(sum[j%i],f[now^][j]);
if (j>=i*i) upd(sum[j%i],mod-f[now^][j-i*i]);
}
}
ans=f[now][n];t=now;
g[][]=;now=;
rep (i,,m){//g[i][j]:i个体积都>m的物品,体积和为j的方案数
now^=;memset(g[now],,sizeof(g[now]));
rep (j,i,n){
upd(g[now][j],g[now][j-i]);
if (j>=m+) upd(g[now][j],g[now^][j-m-]);
}
rep (i,,n) upd(ans,(ll)f[t][i]*g[now][n-i]%mod);
}
cout<<ans;
return ;
}
loj6089 小 Y 的背包计数问题的更多相关文章
- [loj6089]小Y的背包计数问题
https://www.zybuluo.com/ysner/note/1285358 题面 小\(Y\)有一个大小为\(n\)的背包,并且小\(Y\)有\(n\)种物品. 对于第\(i\)种物品,共有 ...
- LOJ6089 小Y的背包计数问题(根号优化背包)
Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. ...
- LOJ6089 小Y的背包计数问题 背包、根号分治
题目传送门 题意:给出$N$表示背包容量,且会给出$N$种物品,第$i$个物品大小为$i$,数量也为$i$,求装满这个背包的方案数,对$23333333$取模.$N \leq 10^5$ $23333 ...
- LOJ6089 小Y的背包计数问题 背包
正解:背包 解题报告: 先放传送门! 好烦昂感觉真的欠下一堆,,,高级数据结构知识点什么的都不会,基础又麻油打扎实NOIp前的题单什么的都还麻油刷完,,,就很难过,,,哭辣QAQ 不说辣看这题QwQ! ...
- 【LOJ6089】小Y的背包计数问题(动态规划)
[LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...
- LOJ #6089. 小 Y 的背包计数问题
LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...
- LOJ#6089 小 Y 的背包计数问题 - DP精题
题面 题解 (本篇文章深度剖析,若想尽快做出题的看官可以参考知名博主某C202044zxy的这篇题解:https://blog.csdn.net/C202044zxy/article/details/ ...
- loj 6089 小 Y 的背包计数问题——分类进行的背包
题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品 ...
- LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...
随机推荐
- μC/OS-Ⅱ在C8051F060上的移植及其应用
嵌入式操作系统是嵌入式应用的基础和核心.随着应用系统的不断复杂化和系统实时性需求的不断提高,对相应软件的逻辑结构.稳定性.实时性也提出了更高的要求,以传统的前后台编程模式编制软件将更加困难,而且容易出 ...
- Centos6.5下搭建nagios详解
一.LAMP环境部署 1.安装php 1.安装yum源 rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-releas ...
- 【洛谷】P1445 没占到1444的愤怒
继续洛谷刷水日常,突然遇到一道不是很水的题目…… https://www.luogu.org/problem/show?pid=1445 题意:给定n(1<=n<=1000000),求方程 ...
- 3 - django-template模板基本使用
目录 1 Template 1.1 模板的基础使用 1.1.1 变量 1.1.2 注释标签 1.1.3 深度查询 1.1.4 内置变量过滤器filter 1.1.5 自定义过滤器之filter 1.1 ...
- 2018 ICPC 徐州网络赛
2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...
- 通过`__slots__` 节省RAM
标签(空格分隔): Python进阶 python中,由于创建每个实例都会有成员,这些成员都会被保存在dict中,但是Python不能静态分配RAM,当创建实例时,因此dict的大小会比所需要的内存大 ...
- Android图片异步加载
原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/A ...
- python网络编程--线程使用threading
一:线程使用 线程使用有两种方法,一种是直接使用,二是通过继承threading.Thread类使用 二:函数式使用 函数式:调用thread模块中的start_new_thread()函数来产生新线 ...
- linux文件处理
取中间的行数作为train.txt sed -n '1000000,170910580p' train.txt > trainv1.txt 取前面的行数作为dev.txt head -10000 ...
- 洛谷P1120 小木棍(升级版)
传送门啦 一道经典的搜索剪枝题,不废话,步入正题. 分析: 一.输入时手动过滤不合法的情况 二.很明显我们要枚举把哪些棍子拼接成原来的长棍,而原始长度(原来的长棍的长度)都相等,因此我们可以在 $ d ...