link

吐槽:

好吧开学了果然忙得要死……不过为了证明我的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 的背包计数问题的更多相关文章

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

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

  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. cdn_一些常用的cdn地址

    https://code.jquery.com/jquery-3.3.1.jshttps://cdn.bootcss.com/jquery/2.1.4/jquery.min.js https://cd ...

  2. prim算法记录路径

    题目链接:https://vjudge.net/contest/66965#problem/H 代码: #include<iostream> #include<string> ...

  3. Unity 3(一):简介与示例

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): Ioc/DI简介: Unity简单示例 一.Ioc/DI简介 IoC 即 Inversion of C ...

  4. 无需登录-悟空CRM 存储型XSS

    无需登录-悟空CRM 存储型XSS 审计悟空的缘由是看见某云爆出CRM的getshell,于是就想着去挖出来瞅瞅!但可能自己把自己给局限了,就想着去挖那些无限制访问的文件. 故事的发生点 漏洞文件:/ ...

  5. 【算法学习】有旋treap

    treap是平衡树的一种.与其他平衡树一样,它也能够支持插入和删除,求第k极值等,接下来我们主要探讨有旋treap的实现过程. treap中每个节点要维护其值,左右孩子以及子树大小.父亲要不要写则看你 ...

  6. 聊天室(上篇)GatewayWorker 基础

    前言 本文的目的是基于 GatewayWorker 官方手册,梳理一次 GatewayWorker,并在实践中与 MVC 框架整合的思路(附最终的项目源码).如果你已经理解了整合这一块儿的知识,那么就 ...

  7. MongoDB中多表关联查询(

    1.使用aggregate 查看表数据 db.getCollection('reports').aggregate([ { $lookup: { from: "process", ...

  8. dedecms自定义模型之独立模型在首页、列表页、内容调用内容

    dedecms关于自定义模型(独立模型)的首页.列表页.内容怎么调用?在后台自定义模型(独立模型)的建立及自定义字段的添加比较简单,需要注意两点: (1)如果某个字段需要在前台列表页显示,则在前台参数 ...

  9. xss攻击原理与解决方法

    概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系 ...

  10. Winfom 插件式(Plugins)/模块化开发框架-动态加载DLL窗体-Devexpress

    插件式(AddIn)架构,不是一个新名词,应用程序采用插件式拼合,可以更好的支持扩展.很多著名的软件都采用了插件式的架构,如常见的IDE:Eclipse,Visual Studio,SharpDeve ...