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. Shell-脚本只能运行1次

    用空文件进行判断 path=`pwd` if [ -f ${path}/.runned ]; then { echo "This script can only execute once! ...

  2. shell脚本实现监控shell脚本的执行流程及变量的值

    这篇文章主要介绍了shell脚本实现监控shell脚本的执行流程及变量的值本文使用shell完成对执行过程中条件语句中的变量的变化的监控和整个程序的执行流程的观察功能,需要的朋友可以参考下 很多时候, ...

  3. sleep允许休眠, delay不允许

    在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. 1.)对于模块本身 mdelay是忙 ...

  4. 基于RESTful API 设计用户权限控制

    RESTful简述 本文是基于RESTful描述的,需要你对这个有初步的了解. RESTful是什么? Representational State Transfer,简称REST,是Roy Fiel ...

  5. Linux学习笔记:ctrl+z、ctrl+c、ctrl+d的区别

    ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.    1.ctrl+c是强制中断程序的执行,进程已经终止.   2.ctrl+z的是将任务中止(暂停的意思),但是此任务并没有结束,他 ...

  6. js交互

    Js和native交互的方法与问题 实现JS和Native交互有两种方式: 第一种:shouldOverrideUrlLoading(WebView view, String url) 通过给WebV ...

  7. JavaWeb--中文乱码小结

    JavaWeb--中文乱码小结 出处:http://chriszz.sinaapp.com0.纯粹html乱码: 换个editor吧(有时候notepad都比sublime_text好用),最好是在& ...

  8. 判断一个字符是否为数字的两种方法(C/C++)

    在平时,我们经常遇见判断字符是否为数字这种题目,虽然感觉还是很简单,不过我是个更喜欢用函数的人,因为我觉得这样更便捷,所以我更推荐第二种方式. 1.直接判断 #include <stdio.h& ...

  9. day2编写购物商城

    作业:购物商城 商品展示,价格 买,加入购物车 付款,钱不够 流程图如下: 代码共有4个文件,如下: 用户文件: alex geng zhang lou zeng 商品文件: 小米3 比亚迪宋 格力变 ...

  10. awk调用shell命令的两种方法:system与print

    from:http://www.oklinux.cn/html/developer/shell/20070626/31550.htmlawk中使用的shell命令,有2种方法: 一.使用所以syste ...