【LOJ6089】小Y的背包计数问题(动态规划)

题面

LOJ

题解

神仙题啊。

我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类。

第一类:\(i\le \sqrt n\)

即需要考虑所有的情况,那么设\(f[i][j]\)表示前\(i\)个物品装了体积\(j\)的方案数。

显然\(f[i][j]=\sum_{k=1}^i f[i][j-k*i]\)转移过来,那么按照\(i\)分剩余类,前缀和转移即可。

这一部分的复杂度是\(O(n\sqrt n)\)

第二类:\(i\ge \sqrt n\)

因为\(i*i\ge n\),所以这一部分的任何一个物品都不存在个数的限制,即可以随意选择。

那么我们只需要用所有大于\(\sqrt n\)的数做整数划分就行了。

设\(g[i][j]\)表示当前一共划分出来了\(i\)个数,和为\(j\)的方案数,每次要么加入一个\(\sqrt n\),要么把所有数\(+1\)。

这一部分因为数的共个数,即\(i\)不会超过\(\sqrt n\),所以总的复杂度也是\(O(n\sqrt n)\)的。

那么这题的总复杂度就是\(O(n\sqrt n)\)了。

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
#define MOD 23333333
#define MAX 100100
int n,m,ans;
int f[350][MAX],g[350][MAX],s[MAX];
int main()
{
cin>>n;m=sqrt(n);
f[0][0]=1;
for(int i=1;i<=m;++i)
{
for(int j=0;j<i;++j)
{
int tot=0;
for(int k=j;k<=n;k+=i)s[++tot]=f[i-1][k];
for(int k=1;k<=tot;++k)s[k]=(s[k-1]+s[k])%MOD;
for(int k=j,tot=0;k<=n;k+=i,++tot)
f[i][k]=(f[i][k]+s[tot+1]-s[max(0,tot-i)]+MOD)%MOD;
}
}
memset(s,0,sizeof(s));g[0][0]=s[0]=1;
for(int i=1;i<=m;++i)
for(int j=0;j<=n;++j)
{
if(j>=i)g[i][j]=(g[i][j]+g[i][j-i])%MOD;
if(j>=m+1)g[i][j]=(g[i][j]+g[i-1][j-(m+1)])%MOD;
s[j]=(s[j]+g[i][j])%MOD;
}
for(int i=0;i<=n;++i)ans=(ans+1ll*s[n-i]*f[m][i])%MOD;
printf("%d\n",ans);
return 0;
}

【LOJ6089】小Y的背包计数问题(动态规划)的更多相关文章

  1. [loj6089]小Y的背包计数问题

    https://www.zybuluo.com/ysner/note/1285358 题面 小\(Y\)有一个大小为\(n\)的背包,并且小\(Y\)有\(n\)种物品. 对于第\(i\)种物品,共有 ...

  2. loj6089 小 Y 的背包计数问题

    link 吐槽: 好吧开学了果然忙得要死……不过为了证明我的blog还没有凉,还是跑来更一波水题 题意: 有n种物品,第i种体积为i,问装满一个大小为n的背包有多少种方案? $n\leq 10^5.$ ...

  3. LOJ6089 小Y的背包计数问题(根号优化背包)

    Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. ...

  4. LOJ6089 小Y的背包计数问题 背包、根号分治

    题目传送门 题意:给出$N$表示背包容量,且会给出$N$种物品,第$i$个物品大小为$i$,数量也为$i$,求装满这个背包的方案数,对$23333333$取模.$N \leq 10^5$ $23333 ...

  5. LOJ6089 小Y的背包计数问题 背包

    正解:背包 解题报告: 先放传送门! 好烦昂感觉真的欠下一堆,,,高级数据结构知识点什么的都不会,基础又麻油打扎实NOIp前的题单什么的都还麻油刷完,,,就很难过,,,哭辣QAQ 不说辣看这题QwQ! ...

  6. LOJ #6089. 小 Y 的背包计数问题

    LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...

  7. LOJ#6089 小 Y 的背包计数问题 - DP精题

    题面 题解 (本篇文章深度剖析,若想尽快做出题的看官可以参考知名博主某C202044zxy的这篇题解:https://blog.csdn.net/C202044zxy/article/details/ ...

  8. loj 6089 小 Y 的背包计数问题——分类进行的背包

    题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品 ...

  9. LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP

    题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...

随机推荐

  1. Unity扩展编辑器二

    Unity支持自行创建窗口,也支持自定义窗口布局,在Project视图中创建一个Editor文件夹,在文件夹中创建一条脚本 自定义窗口需要让脚本继承EditorWindow在设置MenuItem,此时 ...

  2. 【转】利用telnet来进行调试Skynet

    https://blog.csdn.net/WhereIsHeroFrom/article/details/80674408

  3. Stack Overflow访问问题的处理

    一直以来都有访问stackoverflow的习惯,但是老是因为js的问题让人很多操作都操作不了,而且打开的速度也很慢. 原因其实就是stackoverflow使用的google的cdn,于是想彻底一点 ...

  4. 从零开始的Python学习Episode 16——模块

    一.模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相 ...

  5. chattr和lsattr命令详解

    基础命令学习目录首页 原文链接:http://www.ha97.com/5172.html PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chat ...

  6. mkswap命令详解

    基础命令学习目录首页 原文链接:http://blog.51cto.com/arlen99/1743841 mkswap命令用于在一个文件或者设备上建立交换分区.在建立完之后要使用sawpon命令开始 ...

  7. watch命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/kaishirenshi/p/7727986.html watch 命令详解: author:headsen  chen ...

  8. nice和renice命令详解

    基础命令学习目录首页 进程调度是linux中非常重要的概念.linux内核有一套高效复杂的调度机制,能使效率极大化,但有时为了实现特定的要求,需要一定的人工干预.比如,你希望操作系统能分配更多的CPU ...

  9. jenkins部署时遇到“似乎无法联网”,导致无法安装默认插件的解决方案

    jenkins安装更新时,默认会检查网络连接,而默认的checkulr 是http://www.google.com/ ,国内是无法访问的,所以修改成任意可以访问的地址即可,比如http://www. ...

  10. Arithmatic项目修改总结

    Arithmatic项目修改总结 github仓库 arithmatic3.0 一. 修改介绍 修改后类图: 1.关于类的合并 ==可以发现相比右边(旧)的类,左边(新)的类少了很多,这是我这次大改的 ...