题意

题目链接

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. Puppet全面详解

    1.  概述 puppet是一个开源的软件自动化配置和部署工具,它使用简单且功能强大,正得到了越来越多地关注,现在很多大型IT公司均在使用puppet对集群中的软件进行管理和部署,如google利用p ...

  2. UISearchBar 自定义处理

    首先通过 KVC 获取到内部的 textField, 然后自定制处理 UITextField *searchField = [searchBar valueForKey:@"searchFi ...

  3. 字符串变dict

    1.eval 2.json # NameError: name # 'null' is not defined # i_dict=eval(i) 这种方式,如果dict字符串中有null ,将不能变成 ...

  4. sharepoint_study_3

    SharePoint网页无法打开 描述:安装部署好SharePoint开发环境后,再修改计算机的机器名,重启计算机后,发现SharePoint网站不能打开. 解决:1.将机器名改回去,重启计算机,问题 ...

  5. python-使用字典使Fibonacci更有效率

    原代码: def fib(n): if n == 1: return 1 elif n == 2: return 2 else: return fib(n-1)+fib(n-2) 改进后: def f ...

  6. CF :K 一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离。

    题意:给你一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离. 思路:LCA+思维. 设a,b两点间的距离为f(a,b) 则f(a,b)=dis[a]+dis[b]-2*dis[lca( ...

  7. webpack 打包css报错 Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead

    是webpack4和extract-text-webpack-plugin的兼容性问题 执行命令:npm install extract-text-webpack-plugin@next --save ...

  8. 109th LeetCode Weekly Contest Number of Recent Calls

    Write a class RecentCounter to count recent requests. It has only one method: ping(int t), where t r ...

  9. [微信小程序] -- wxss引用外部css文件及iconfont

    小程序引入外部文件的方式是: 只需要在其css文件写上: @import "外部css地址.wxss"; 因为项目需要, 小程序中需要使用iconfont , 很容易就想到了H5的 ...

  10. 再谈java枚举 ENUM

    [From] http://www.cnblogs.com/rollenholt/archive/2012/11/27/2790402.html 没有枚举之前: 在没有枚举之前,我们想列举一些相关的常 ...