题解 51nod 1597 有限背包计数问题】的更多相关文章

题目传送门 题目大意 给出 \(n\),第 \(i\) 个数有 \(i\) 个,问凑出 \(n\) 的方案数. \(n\le 10^5\) 思路 呜呜呜,傻掉了... 首先想到根号分治,分别考虑 \([1,\sqrt n]\) 以及 \([\sqrt n+1,n]\). \([1,\sqrt n]\) 不难看出这部分可以直接 dp,设 \(f_{i,j}\) 为前面 \(i\) 种物品选出重量为 \(j\) 的方案数,可以得到转移式: \[f_{i,j}=f_{i-1,j}+f_{i,j-i}-…
题意 题目链接 Sol 不会做啊AAA.. 暴力上肯定是不行的,考虑根号分组 设\(m = \sqrt{n}\) 对于前\(m\)个直接暴力,利用单调队列优化多重背包的思想,按\(\% i\)分组一下.复杂度\(O(n\sqrt{n})\) 对于后\(m\)个,此时每个物品没有个数的限制,换一种dp方法 设\(g[i][j]\)表示用了\(i\)个物品,大小为\(j\)的方案数. 转移的时候有两种方案 把当前所有物品大小\(+1\),\(g[i][j + i] += g[i][j]\) 新加入一…
首先这道题理论上是可以做到O(nlogn)的,因为OEIS上有一个明显可以用多项式乘法加速的式子 但是由于模数不是很兹磁,所以导致nlogn很难写 在这里说一下O(n*sqrt(n))的做法 首先我们很容易发现当物品的大小>sqrt(n)的时候,物品数量的限制形同虚设 也就是说物品的大小>sqrt(n)的时候实际上是一个完全背包 而对于完全背包,有着另外一种做法(参照NOIP2001 数的划分) 由于我们知道假设我们只用>sqrt(n)的物品,我们最多使用sqrt(n)个物品 不妨设f[…
传送门 另一个传送门 这题还挺有意思…… 先贴一波出题人的题解…… (啥你说你看不见?看来你还没过啊,等着A了再看或者乖乖花点头盾好了……) 然后是我的做法……思想都是一样的,只是细节不一样而已…… 令$B=\lceil \sqrt{n}\rceil$,把物品分$\ge B$和$<B$两类考虑: 对于大小$<B$的物品,直接用多重背包计数的方法去做即可,令$f[i][j]$表示使用前$i$个物品凑出$j$的方案数,显然有 \begin{align}f[i][j]=\sum_{k=0}^i f[…
你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少 两种方案不同当且仅当存在至少一个数i满足第i种物品使用的数量不同 Input 第一行一个正整数n 1<=n<=10^5 Output 一个非负整数表示答案,你需要将答案对23333333取模   首先我们可以发现,令S=sqrt(n),那么对于大小大于S的物品,其实是用不完的,我们可以把他们的数量视为无限个 对于大小小于S的物品,我们可以令f[i][j]表示考虑了前i个物品,总大小为j的方案数,…
传送门 dp好题. 我认为原题的描述已经很清楚了: 你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少. 两种方案不同当且仅当存在至少一个数i满足第i种物品使用的数量不同. 然而我只会O(n2)O(n^2)O(n2)的做法. 然后通过搜题解学会了O(n∗sqrt(n))O(n*sqrt(n))O(n∗sqrt(n))的做法. 简单讲讲. 首先我们需要分布考虑. 对于大于sqrt(n)sqrt(n)sqrt(n)的物品是选不完的,相当于没有数量限制.…
[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…
LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选\(\sqrt n\)个数,所以数量就没有卵用了.然后就用完全背包的一个常见套路(?)可以对一个空的序列整体+1或者在最左边加上一个\(\sqrt n+1\),这个操作序列和完全背包的选择方案一一对应.感性理解一下是对的emmmm,复杂度\(O(n\sqrt n)\) \(<=\sqrt n\)的部分只…
题面 题解 (本篇文章深度剖析,若想尽快做出题的看官可以参考知名博主某C202044zxy的这篇题解:https://blog.csdn.net/C202044zxy/article/details/109141757) 在起码了解了背包DP后,我们来做这道题 既然每种物品最大可占据 i*i 的空间,设  那么  和  两种情况肯定是不同的 ,而且应该可以分开处理 由于  时 i 的范围很小,可以在一个处理到一半的背包上(即处理了[sq+1,n]的背包dp数组)继续跑(背包大小 * 物品数),所…
Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. 所以我们设dp[i][j]表示放了i个物品,体积为j时的方案数. 转移的话一种是往背包里放一个新物品,或者让背包里所有物品体积加1. 当物品体积小于根号n时,因为物品个数比较少,所以我们可以设计状态为dp[i][j]表示前i个物品,占用j的体积为j时的方案数. 然后我们发现它的同类转移点是在模i的剩…
题目传送门 题意:给出$N$表示背包容量,且会给出$N$种物品,第$i$个物品大小为$i$,数量也为$i$,求装满这个背包的方案数,对$23333333$取模.$N \leq 10^5$ $23333333=17 \times 1372549$竟然不是质数性质太不优秀了(雾 直接跑背包$O(N^2)$,于是咱们考虑挖掘性质.分开计算 发现当$i < \sqrt{N}$时就是一个多重背包,用单调队列优化到$O(N \sqrt{N})$ 而当$i \geq \sqrt{N}$时,选中物品的数量不会超…
正解:背包 解题报告: 先放传送门! 好烦昂感觉真的欠下一堆,,,高级数据结构知识点什么的都不会,基础又麻油打扎实NOIp前的题单什么的都还麻油刷完,,,就很难过,,,哭辣QAQ 不说辣看这题QwQ! 首先注意到当i>=√n时相当于是有无穷个的 可以想到对不同的物品数量进行分类讨论 对于i<√n,就最普通的背包,f[i][j]:第i个物品已装容量为j的方案数 转移就是f[i][j]=∑f[i-1][j-k*i](0<=k<=i)(这个显然可以降维变成f[i]:容量为i的方案数 然后…
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…
题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品. 所以体积<=sqrt(n)的物品多重背包,大于sqrt(n)的就变成最小值是sqrt(n)+1.最多有sqrt(n)个物品的方案数,可以用那种“整体+1 或 新增一列”的套路解决. #include<iostream> #include<cstdio> #include<…
思路: 如果体积乘以数量>=W,那么直接用完全背包模型.如果不到的话,用二进制优化就好了. 基础题,感觉这样写很优雅?回去睡觉. #include <bits/stdc++.h> using namespace std; typedef long long LL; int dp[50010],n,W; int c,w,v; void zero_or_one(int val,int wi) { for(int i=W;i>=wi;i--) dp[i]=max(dp[i],dp[i-w…
https://www.zybuluo.com/ysner/note/1285358 题面 小\(Y\)有一个大小为\(n\)的背包,并且小\(Y\)有\(n\)种物品. 对于第\(i\)种物品,共有\(i\)个可以使用,并且对于每一个\(i\)物品,体积均为\(i\). 求小\(Y\)把该背包装满的方案数为多少,答案对于\(23333333\)取模. 定义两种不同的方案为:当且仅当至少存在一种物品的使用数量不同. \(n\leq10^5\) 解析 这个背包问题让我耳目一新啊. \(idea\)…
原题传送门 我自闭了qaq 这道题非常简单,因为1<=c<=100,所以直接对每个c开二维树状数组,操作就跟模板一样 写码5分钟,调码半小时,这道题的输入顺序是x1,x2,y1,y2,我真的自闭了 #include <bits/stdc++.h> #define getchar nc #define N 305 #define C 105 using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*…
题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k <= i ) f[i-1][j - k*i] 可以用前缀和优化,因为第 i 次只会用到间隔为 i 的和: 对于 i > √n ,最多选 √n 个,所以设 g[i][j] 表示用 i 个,体积为 j 的方案数: 每种方案如果排一个序,就是一个最小值为 √n + 1 的不降序列,所以算出不降序列的个数…
1409 加强版贪吃蛇 听着懵逼做着傻逼. 每个格子只能经过一次,穿过上下界答案清0,不考虑穿的话就随便dp.如果要穿就是从尽可能上面的位置穿过上界,尽可能下面的位置穿过下界. 那么转移这一列之前找一下最上面最下面可以转移的位置.注意一下转移顺序什么的把细节写陈展就好了. //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++) #define Rep(i,a,b) for(int i=(a)…
A 取余最长路 不难发现路径可以拆成三条线段,只要知道两个转折点的位置就能计算出答案. 设sum(i,l,r)表示第i行从l到r元素的和,则答案可以表示为sum(1,1,x)+sum(2,x,y)+sum(3,y,n)%p. 前缀和一下转化成(S3[n]-S3[y-1])+S2[y]+(S1[x]-S2[x-1])%p,从小到大枚举y,将所有(S1[x]-S2[x-1])扔到一个集合里,用个set就能轻松实现了. 时间复杂度为O(NlogN). #include<cstdio> #includ…
次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一组中分别又取1个,2个,3个......n个客户 化为背包思想即 j为一共有j组 背包容量为每组的客户数总和 把该节点的每个儿子看成一组 每组中的元素为选一个,选两个...选n个用户 状态转移方程: f[i][j]=max(f[i][j],f[i][j-k]+f[v][k]-边权);//i为根 j为…
续.....TAT这回不到50题编辑器就崩了.. 这里塞40道吧= = bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 比较经典的最小割?..然而一开始还是不会QAQ 和地震伤害1的区别在于这题求的是最少的损坏牧场数目.把牧场拆点,因为要让1和被报告的点不联通,把1归到S集,被报告的点归到T集,就变成求最小割了. 具体建图: 假设点拆成x和x’,x和x‘间连边(就是等下要割的).被报告的点和1点:容量无穷大(不能割):其他点容量为1. 原图中…
这套题实在是太神仙了..做了我好久...好多题都是去搜题解才会的 TAT. 剩的那道题先咕着,如果省选没有退役就来填吧. 「SDOI2017」龙与地下城 题意 丢 \(Y\) 次骰子,骰子有 \(X\) 面,每一面的概率均等,取值为 \([0, X)\) ,问最后取值在 \([a, b]\) 之间的概率. 一个浮点数,绝对误差不超过 \(0.013579\) 为正确. 数据范围 每组数据有 \(10\) 次询问. \(100\%\) 的数据,\(T \leq 10\),\(2 \leq X \l…
题目链接:http://codeforces.com/contest/864/problem/E 题解:这题一看就很像背包但是这有3维限制也就是说背包取得先后也会对结果有影响.所以可以考虑sort来降低维度(这是常用的方法) 然后就是简单的有限背包至于这题还要求存下娶了哪些东西可以用vector来存. #include <iostream> #include <cstring> #include <cstdio> #include <vector> #inc…
传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Hasan has a set of N coins and Bahosain has a set of M coins. The video game costs W JDs. Find the number of ways in which they can pay exactly W JDs su…
Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接快速幂 代码 #include<bits/stdc++.h> using namespace std; long long quickpow(long long m,long long n,long long k) { long long b = 1; while (n > 0) { if…
题目大意 现有一个天平,它有C个挂钩和G个砝码,问有多少种方法可以使得天平平衡(砝码必须用完) 题解 其实就是让背包容量为0的方法有多少种方法,但是这样的话背包容量会出现负数,所以可以平移一下,背包容量最大值为20*25*15=7500,即平移量为7500,最后答案就是dp[G][7500] 代码: #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define…
题目链接 [洛谷传送门] 题解 非常简单的背包. \(f[i]\)表示购买\(i\)个物品所需要最少的花费. 不考虑免费的限制条件,那么一定是选择前\(k\)个双鞋子. 那么加入免费的条件,那么还是要挑最便宜的买. \(g[i]\)表示购买\(i\)双鞋子能够免费最多的数量. 状态转移方程就是\(f[i]=min(f[i],f[j]+calc(i,j))\),其中\(j\in[1,i)\) 把这个\(calc(i,j)\)展开来就是\(\sum^i_{k=j+1}a[k]-\sum^{j+g[i…
JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法描述大致如下: 假设我们要对一个大小为 \(n\) 的数列 \(a\) 排序. 等概率随机生成一个大小为 \(n\) 的排列 \(p\) . 构造一个大小为 \(n\) 的数列 \(b\) 满足 \(b_i=a_{p_i}\) ,检查 \(b\) 是否有序,如果 \(b\) 已经有序了就结束算法,并…
题目链接:http://poj.org/problem?id=3624 Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charms. Each charm i in the supplied list…