[loj6089]小Y的背包计数问题
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的背包计数问题的更多相关文章
- loj6089 小 Y 的背包计数问题
link 吐槽: 好吧开学了果然忙得要死……不过为了证明我的blog还没有凉,还是跑来更一波水题 题意: 有n种物品,第i种体积为i,问装满一个大小为n的背包有多少种方案? $n\leq 10^5.$ ...
- 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 ...
随机推荐
- 通过更改scrapy源码进行spider分发实现一个综合爬虫
最近我正写一个项目,项目的需求如下一,要爬取大约100种几百个网页的类容,并且这些网页的爬取频率不一样,有些一天爬取一次,有些一周爬取一次,二,网页爬取内容有变化,也就是说要爬取的内容会根据需求进行改 ...
- django 使用框架下auth.models自带的User进行扩展增加字段
需要改动三个地方: 1.models.py 创建模型User,并继承原模型类AbstraUser(在此处我增加了一个新的字段手机号) from django.db import models # ...
- xtu summer individual 3 F - Opening Portals
Opening Portals Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...
- L2-001. 紧急救援 (Dijkstra算法打印路径)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- Linux读取网卡流量脚本
#!/bin/bash #eval `date "+day=%d; month=%m; year=%Y; hour=%H; minute=%M second=%S"` #INSTF ...
- java web 验证码 第一次不正确的问题,解决方案
首先是form表单 ,获取图片验证码 然后使用js 去服务器验证 问题: 第一次明明输入正确 ,确验证不了??那是因为你在form表单发起请求 和 ajax 发起的请求 地址 中 一个使用127. ...
- Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filter这种方式可以实现Bean预处理.后处理. 比如注入FilterRegistrationBean,然后 ...
- 携程Apollo(阿波罗)配置中心使用Google代码风格文件(在Eclipse使用Google代码风格)(配合阿里巴巴代码规约快速设置)
Apollo默认使用了Google的代码风格,文件放在这里: https://github.com/ctripcorp/apollo/tree/master/apollo-buildtools/sty ...
- 保持WCF服务端与客户端的长连接
背景 客户端与服务端使用WCF建立连接后:1.可能长时间不对话(调用服务操作):2.客户端的网络不稳定. 为服务端与客户端两边都写“心跳检测”代码?不愿意. 解决 设置inactivityTimeou ...
- Python进阶系列之怎么写出pythonic的代码
使用 in/not in 检查key是否存在于字典中 判断某个key是否存在于字典中时,一般的初学者想到的方法是,先以列表的形式把字典所有的key返回,在判断该key是否存在于key列表中 d = { ...