题意

题目链接

Sol

不会做啊AAA。。

暴力上肯定是不行的,考虑根号分组

设\(m = \sqrt{n}\)

对于前\(m\)个直接暴力,利用单调队列优化多重背包的思想,按\(\% i\)分组一下。复杂度\(O(n\sqrt{n})\)

对于后\(m\)个,此时每个物品没有个数的限制,换一种dp方法

设\(g[i][j]\)表示用了\(i\)物品,大小为\(j\)的方案数。

转移的时候有两种方案

  1. 把当前所有物品大小\(+1\),\(g[i][j + i] += g[i][j]\)

  2. 新加入一个最小的物品, \(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 有限背包计数问题 (背包 分块)的更多相关文章

  1. 题解 51nod 1597 有限背包计数问题

    题目传送门 题目大意 给出 \(n\),第 \(i\) 个数有 \(i\) 个,问凑出 \(n\) 的方案数. \(n\le 10^5\) 思路 呜呜呜,傻掉了... 首先想到根号分治,分别考虑 \( ...

  2. LOJ6089 小Y的背包计数问题 背包、根号分治

    题目传送门 题意:给出$N$表示背包容量,且会给出$N$种物品,第$i$个物品大小为$i$,数量也为$i$,求装满这个背包的方案数,对$23333333$取模.$N \leq 10^5$ $23333 ...

  3. LOJ6089 小Y的背包计数问题 背包

    正解:背包 解题报告: 先放传送门! 好烦昂感觉真的欠下一堆,,,高级数据结构知识点什么的都不会,基础又麻油打扎实NOIp前的题单什么的都还麻油刷完,,,就很难过,,,哭辣QAQ 不说辣看这题QwQ! ...

  4. LOJ #6089. 小 Y 的背包计数问题

    LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...

  5. 【LOJ6089】小Y的背包计数问题(动态规划)

    [LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...

  6. POJ 3260 多重背包+完全背包

    前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168 ...

  7. 【poj3260-最少找零】多重背包+完全背包

    多重背包+完全背包. 买家:多重背包:售货员:完全背包: 开两个数组,分别计算出买家,售货员每个面额的最少张数. 最重要的是上界的处理:上界为maxw*maxw+m(maxw最大面额的纸币). (网上 ...

  8. HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)

    HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...

  9. 背包!背包!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= ...

随机推荐

  1. promise思考

    我写了三个单元块,分别对应三种业务场景 let query;query = (url) => { url=url||"传递的参数为空"; return new Promise ...

  2. php中的openssl开启方法

    windows下开启方法: 1: 首先检查php.ini中:extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘:', 如果不存在这行,那么添加extensio ...

  3. 天梯赛easy题

    2 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> ...

  4. VBS修改本机的账号密码

    On Error Resume Next strComputer = "." Set WshShell = WScript.CreateObject("WScript.S ...

  5. jmeter+ant+jenkins生产的报告乱码

    jmeter+ant+jenkins生产的报告乱码 问题:生产报告会乱码的问题,一般是有编码格式引起的.我遇到的问题是,jmeter需要读取csv的数据作为参数.但是我们并不知道csv保存是什么编码格 ...

  6. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  7. oracle12C--DG搭建配置

    一,主库前期操作 搭建的话和11g差不多,点点点. 两台服务器,一台主库,一台从库 01,配置主库hosts cat /etc/hosts 192.168.0.31 node12c01 192.168 ...

  8. Unity GetComponentsInChildren<T>(true);

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class GetCompo ...

  9. 读取日志文件,搜索关键字,打印关键字前5行。yield、deque实例

    from collections import deque def search(lines, pattern, history=5): previous_lines = deque(maxlen=h ...

  10. (转)开发监控Linux 内存 Shell 脚本

    原文:http://blog.csdn.net/timchen525/article/details/76474017 题场景: 开发Shell 脚本判断系统剩余内存的大小,如果低于100MB,就邮件 ...