博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1597 有限背包计数问题 (背包 分块)
阅读量:4563 次
发布时间:2019-06-08

本文共 2400 字,大约阅读时间需要 8 分钟。

题意

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
#include
#include
#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;}

转载于:https://www.cnblogs.com/zwfymqz/p/9811628.html

你可能感兴趣的文章
[TYVJ1827]『Citric II』一道防AK好题
查看>>
poj 2785(折半枚举+二分搜索)
查看>>
Matrix4x4
查看>>
PHP7新功能及语法变化总结
查看>>
如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例
查看>>
Python正则表达式初识(三)
查看>>
java step1:基础知识4
查看>>
qbzt day1 上午
查看>>
Java——参数传递
查看>>
Python全栈开发:socket代码实例
查看>>
centos7 下通过nginx+uwsgi部署django应用
查看>>
GNU make manual 翻译( 一百四十五)
查看>>
面试题集锦
查看>>
Python函数中的*与**
查看>>
地图划线Demo
查看>>
风险管理,未雨绸缪——《代码之殇》读书笔记II
查看>>
Springboot 系列(十一)使用 Mybatis(结合自动化生成插件) 访问数据库
查看>>
php-fpm开启报错-ERROR: An another FPM instance seems to already listen on /tmp/php-cgi.sock
查看>>
leetcode1
查看>>
c++源文件到可执行文件的过程
查看>>