51nod 1597 有限背包计数问题 (背包 分块)
题意
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]\)
新加入一个最小的物品, \(g[i + 1][j + m + 1] += g[i][j]\)
看上去很显然,但自己想不出来qwq
#include<cstdio>
#include<cmath>
#include<cstring>
#define pt(x) printf("%d\n", x);
using namespace std;
const int MAXN = 1e5 + 10, mod = 23333333;
int N, M, f[81][MAXN], g[81][MAXN];
int add(int x, int y) {
return (x + y >= mod) ? (x + y - mod): x + y;
}
int main() {
scanf("%d", &N);
M = sqrt(N);
/*f[0][0] = 1; int o = 1;
for(int i = 1; i <= M; i++) {
for(int k = 0; k < i; k++) {//res
int s = 0;
for(int t = 0; i * t + k <= N; t++) {//num
s = add(s, f[i - 1][k + t * i]);
f[i][k + t * i] = s;
if(t >= i) s = (s - f[i - 1][(t - i) * i + k] + mod) % mod;//over take
}
}
}
int ans = f[M][N];
pt(ans)
g[0][0] = 1; int p = 0;
for(int i = 1; i <= M; i++) {// used i goods
for(int j = 0; j <= N; j++) {// length is j
if(j >= M + 1) g[i][j] = g[i - 1][j - (M + 1)];
if(j >= i) g[i][j] = add(g[i][j], g[i][j - i]);
}
for(int j = 0; j <= N; j++) (ans += 1ll * f[M][j] * g[i][N - j] % mod) %= mod;
}
printf("%d", ans);*/
f[0][0] = 1; int o = 1;
for(int i = 1; i <= M; i++, o ^= 1) {
memset(f[o], 0, sizeof(f[o]));
for(int k = 0; k < i; k++) {//res
int s = 0;
for(int t = 0; i * t + k <= N; t++) {//num
s = add(s, f[o ^ 1][k + t * i]);
f[o][k + t * i] = s;
if(t >= i) s = (s - f[o ^ 1][(t - i) * i + k] + mod) % mod;//over take
}
}
}
int ans = f[o ^ 1][N], tmp = o ^ 1;
pt(ans)
g[0][0] = 1; o = 1;
for(int i = 1; i <= M; i++, o ^= 1) {// used i goods
memset(g[o], 0, sizeof(g[o]));
for(int j = 0; j <= N; j++) {// length is j
if(j >= M + 1) g[o][j] = g[o ^ 1][j - (M + 1)];
if(j >= i) g[o][j] = add(g[o][j], g[o][j - i]);
}
for(int j = 0; j <= N; j++) (ans += 1ll * f[tmp][j] * g[o][N - j] % mod) %= mod;
}
printf("%d", ans);
return 0;
}
51nod 1597 有限背包计数问题 (背包 分块)的更多相关文章
- 题解 51nod 1597 有限背包计数问题
题目传送门 题目大意 给出 \(n\),第 \(i\) 个数有 \(i\) 个,问凑出 \(n\) 的方案数. \(n\le 10^5\) 思路 呜呜呜,傻掉了... 首先想到根号分治,分别考虑 \( ...
- LOJ6089 小Y的背包计数问题 背包、根号分治
题目传送门 题意:给出$N$表示背包容量,且会给出$N$种物品,第$i$个物品大小为$i$,数量也为$i$,求装满这个背包的方案数,对$23333333$取模.$N \leq 10^5$ $23333 ...
- LOJ6089 小Y的背包计数问题 背包
正解:背包 解题报告: 先放传送门! 好烦昂感觉真的欠下一堆,,,高级数据结构知识点什么的都不会,基础又麻油打扎实NOIp前的题单什么的都还麻油刷完,,,就很难过,,,哭辣QAQ 不说辣看这题QwQ! ...
- LOJ #6089. 小 Y 的背包计数问题
LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...
- 【LOJ6089】小Y的背包计数问题(动态规划)
[LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...
- POJ 3260 多重背包+完全背包
前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168 ...
- 【poj3260-最少找零】多重背包+完全背包
多重背包+完全背包. 买家:多重背包:售货员:完全背包: 开两个数组,分别计算出买家,售货员每个面额的最少张数. 最重要的是上界的处理:上界为maxw*maxw+m(maxw最大面额的纸币). (网上 ...
- HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...
- 背包!背包!HDU 2602 Bone Collector + HDU 1114 Piggy-Bank + HDU 2191 512
http://acm.hdu.edu.cn/showproblem.php?pid=2602 第一题 01背包问题 http://acm.hdu.edu.cn/showproblem.php?pid= ...
随机推荐
- P3480 [POI2009]KAM-Pebbles 阶梯NIM
$ \color{#0066ff}{ 题目描述 }$ 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时 ...
- ThinkCMF Foreach标签
foreach标签类似与volist标签,只是更加简单,没有太多额外的属性,例如: <foreach name="list" item="vo"> ...
- winform工具1-图片去除水印
效果图: 思路: 1.获取图片 2.处理水印 3.保存处理的图片 代码: 获取图片: private void button1_Click(object sender, EventArgs e) { ...
- Domoticz 中添加彩云天气
前言 用过一段时间的彩云天气 APP,最吸引我的地方是精确到局部区域的天气预测,虽然准确度并不算高,但是对于预测下雨还是不错的选择.在 Domoticz 中添加彩云天气的数据,利用的是彩云天气提供的 ...
- JavaWeb学习笔记(十四)—— 使用JDBC处理MySQL大数据
一.什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据.大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据 ...
- day--39-MySQL的多表查询
多表查询一:表的基本介绍 可以参考:https://www.cnblogs.com/cdf-opensource-007/p/6517627.html 建立一个员工表信息表和一个部门表,每个员工都对应 ...
- C++_类继承3-动态联编和静态联编
程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问题. 将源代码中的函数调用解释为特定的函数代码块被称为函数名联编(binding). 在C语言中,这非常简单,因为每个函数名对应一个不同的 ...
- Luogu P2243 电路维修 双端队列BFS
当转移的代价是0和一个分明不同的权值时,可以用双端队列BFS去跑(你跑最短路也没问题..QWQ) 而对于这道题,边旋转代价是1,不旋转代价是0:可以直接建图最短路,也可以跑BFS 这个题建图很有意思: ...
- c++中map的基本函数
c++中map的一些方法 begin() 返回指向map头部的迭代器 clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回 ...
- POJ - 3233 矩阵套矩阵
题意:给你矩阵\(A\),求\(S=\sum_{i=1}^{k}A^i\) 构造矩阵 \[ \begin{bmatrix} A & E \\ 0 & E\\ \end{bmatrix} ...