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 ...
随机推荐
- win10+anaconda虚拟环境python3.6+cuda9.0+cudnn7+pytorch0.4.1
anaconda下jupyter notebook的打开目录的修改:参考:https://www.cnblogs.com/amberdata/p/7907845.html pytorch官网:http ...
- 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
人生的大起大落莫过如此,下一场我一定要回紫. [A]Points on the line 题意: 一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\). 题解: 暴力两重fo ...
- shell脚本实现分日志级别输出
shell脚本如何优雅的记录日志信息,下面让我们一步一步,让shell脚本的日志也变得高端起来,实现如下功能 ①设定日志级别,实现可以输出不同级别的日志信息,方便调试 ②日志格式类似为:[日志级别] ...
- Python Challenge 第 2 关攻略:ocr
text="那一大推乱码" 方案1 from collections import Counter print(Counter(text)) 方案2 import string & ...
- [Android Studio] Android Studio如何快速生成get,set,tostring,构造函数
刚开始使用Android Studio时,在创建一个javabean时,很习惯的在JavaBean类中,右键去找生成get,set等选项.但是很遗憾,找不到. 那这边如何快速的set,get或者生成构 ...
- 【2017-10-1】雅礼集训day1
今天的题是ysy的,ysy好呆萌啊. A: 就是把一个点的两个坐标看成差分一样的东西,以此作为区间端点,然后如果点有边->区间没有交. B: cf原题啊.....均摊分析,简单的那种. 线段树随 ...
- 【本地服务器】用nodejs搭建最简单、轻量化的http server
1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后台语言. 但是你制作出来的网页总要运行.总要测试吧?——那就免不了用到http server.我先前都是用vis ...
- Go 的package
一.包的一些基本的概念 1.在同一个目录下的所有go文件中,只能有一个main函数.如果存在多个main函数,则在编译的时候会报错 那么,在同一个目录下的两个go文件究竟是什么关系? 为什么会彼此影响 ...
- Python元组与字典详解
Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup ...
- SonarQube代码质量管理工具的安装(Linux)
一.安装配置sonar 1.Sonar介绍 Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具, ...