https://www.zybuluo.com/ysner/note/1285358

题面

小\(Y\)有一个大小为\(n\)的背包,并且小\(Y\)有\(n\)种物品。

对于第\(i\)种物品,共有\(i\)个可以使用,并且对于每一个\(i\)物品,体积均为\(i\)。

求小\(Y\)把该背包装满的方案数为多少,答案对于\(23333333\)取模。

定义两种不同的方案为:当且仅当至少存在一种物品的使用数量不同。

  • \(n\leq10^5\)

解析

这个背包问题让我耳目一新啊。

\(idea\)棒棒的。

注意到题目中物品\(i\)(\(i\geq\sqrt n\))的个数限制实际上是不存在的。

所以可以把这个问题分为两个子问题:多重背包问题和完全背包问题。

设\(f[i][v]\)表示前\(i\)个物品,总体积为\(v\)时的方案数。

对于\(i\leq\sqrt n\):(多重背包问题)

很显然有$$f[i][v]=\sum_{j=1}^if[i-1][v-j*i]$$

可以前缀和优化做到\(O(n\sqrt n)\)。

对于\(i\geq\sqrt n\):(完全背包问题)

又注意到一个物品最多取\(\sqrt n\)个。

同样设个\(g[i][v]\)表示方案数。

可以认为我们要\(DP\)出一个和为\(n\),最小数至少\(\sqrt n+1\)的不下降序列

(序列中的数是物品体积)。

转移有两种:

  • 在序列开头加入一个数\(\sqrt n+1\)
  • 把序列中所有数\(+1\)

则$$g[i][v]=g[i-1][v-\sqrt n-1]+g[i][v-i]$$

这个复杂度\(O(n)\)?

最后讨论一下给前一个问题分配多少体积,后一个问题分配多少体积,统计答案即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=2005,inf=2e9,mod=23333333;
int n,f[N],g[350][N],s[N],ans=-inf,m;
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
int main()
{
n=gi();m=sqrt(n);
f[0]=1;
fp(i,1,m)
{
fp(j,0,i) s[j]=f[j];
fp(j,i,n) s[j]=(f[j]+s[j-i])%mod;//前缀和
fp(j,0,n)
{
f[j]=s[j];
if(j-i*(i+1)>=0) f[j]=(f[j]-s[j-i*(i+1)]+mod)%mod;//去掉不合法状态
}
}
g[0][0]=1;ans=f[n];
fp(i,1,m)
for(re int j=i*(m+1);j<=n;j++)
{
g[i][j]=(g[i-1][j-m-1]+g[i][j-i])%mod;
(ans+=1ll*g[i][j]*f[n-j]%mod)%=mod;
}
printf("%d\n",ans);
return 0;
}

[loj6089]小Y的背包计数问题的更多相关文章

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

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

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

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

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

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

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

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

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

    [LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...

  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. 常见的Redis问题?

    Redis的那些最常见面试问题[转] 1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据 ...

  2. CSU1160

    十进制-十六进制 Time Limit: 1 Sec  Memory Limit: 128 MB Description 把十进制整数转换为十六进制,格式为0x开头,10~15由大写字母A~F表示. ...

  3. C51 继电器 个人笔记

    一句话 小电流控制大电流的开关. 电路图 给J2端口一个低电平,三极管导通,线圈吸合 一般用P1^4口连接 #include <reg51.h> #define u16 unsigned ...

  4. JavaEE JDBC ResultSet内外移动

    ResultSet内外移动 @author ixenos 内外移动指位置光标的移动 内移动就是一个ResultSet得到后的那个光标! 外移动就是多个ResultSet的迭代 内移动 一般的数据库都不 ...

  5. Excel表格如何设置密码 Excel2003/2007/2010设置密码教程

    http://www.wordlm.com/special/2/ 经常使用Excel表格制作报表和一些数据后,我们会给Excel表格设置密码,这样可以很有效的防止数据被盗取.目前Office版本众多, ...

  6. topcoder SRM 639 div2

    见这里 http://ygdtc.sinaapp.com/?p=257

  7. 前端开发:JavaScript---DOM & BOM

    DOM:Document Object Model  文档对象类型 模态框案例 <!DOCTYPE html> <html lang="en"> <h ...

  8. http post提交数组

    方式一:@RequestParam方式 服务提供方用@RequestParam注解接收参数,参数类型为long数组: @ApiOperation(value = "***", ta ...

  9. 子集和的目标值(codevs 1692)

    题目描述 Description 给定n个整数in和目标值T,求某一非空子集使 子集的元素的和 与 目标值之差 的绝对值最小,元素可重复 输入描述 Input Description 第一行为整数n ...

  10. 【BZOJ4591】超能粒子炮·改(Lucas定理,组合计数)

    题意: 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...