Luogu P4141 消失之物 背包 分治
题意:给出$n$个物品的体积和最大背包容量$m$,求去掉一个物品$i$后,装满体积为$w\in [1,m]$背包的方案数。
有 N 个物品, 体积分别是 W1, W2, …, WN。 由于她的疏忽, 第 i 个物品丢失了。 “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” — 这是经典的问题了。她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。
输入:第1行:两个整数 N (1 ≤ N ≤ 2 × 10^3) 和 M (1 ≤ M ≤ 2 × 10^3),物品的数量和最大的容积。
第2行: N 个整数 W1, W2, …, WN, 物品的体积。
输出:一个 N × M 的矩阵, Count(i, x)的末位数字。
思路:背包,分治。
提交次数:1次(课上刚讲的)
题解:
定义$solve(s,l,r)$表示第$s$层,所处区间$[l,r]$。
递归过程:拷贝上一层状态到本层,先将$[md+1,r]$的物品添加到背包中,然后$solve(s+1,l,md)$,然后清空本层状态,重置为上一层状态,再将$[l,md]$的物品添加到背包中,然后$solve(s+1,md+1,r)$,边界是$l==r$,此时只有$l$这个物品没有被添加进背包,所以输出就好了。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstring>
#define R register int
using namespace std;
//你弱,有什么资格休息
#define ull unsigned long long
#define ll long long
#define pause (for(R i=1;i<=10000000000;++i))
#define In freopen("NOIPAK++.in","r",stdin)
#define Out freopen("out.out","w",stdout)
namespace Fread {
static char B[<<],*S=B,*D=B;
#ifndef JACK
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
#endif
inline int g() {
R ret=,fix=; register char ch;
while(!isdigit(ch=getchar()))
fix=ch=='-'?-:fix;
if(ch==EOF) return EOF;
do
ret=ret*+(ch^);
while(isdigit(ch=getchar()));
return ret*fix;
}
inline bool isempty(const char& ch) {
return (ch<=||ch>=);
}
inline void gs(char* s) {
register char ch; while(isempty(ch=getchar()));
do *s++=ch; while(!isempty(ch=getchar()));
}
}
using Fread::g;
using Fread::gs; namespace Luitaryi {
const int N=;
int n,m;
int f[][N],w[N];
inline void solve(int s,int l,int r) {
if(l==r) {
for(R i=;i<=m;++i) printf("%d",f[s-][i]);
putchar('\n'); return ;
}
R md=l+r>>;
memcpy(f[s],f[s-],sizeof(f[s-]));
for(R i=md+;i<=r;++i) for(R j=m;j>=w[i];--j)
f[s][j]+=f[s][j-w[i]],f[s][j]%=;
solve(s+,l,md);
memcpy(f[s],f[s-],sizeof(f[s-]));
for(R i=l;i<=md;++i) for(R j=m;j>=w[i];--j)
f[s][j]+=f[s][j-w[i]],f[s][j]%=;
solve(s+,md+,r);
}
inline void main() {
n=g(),m=g();
for(R i=;i<=n;++i) w[i]=g();
f[][]=; solve(,,n);
}
} signed main() {
Luitaryi::main();
return ;
}
2019.07.14
Luogu P4141 消失之物 背包 分治的更多相关文章
- [BZOJ 2287/POJ openjudge1009/Luogu P4141] 消失之物
题面: 传送门:http://poj.openjudge.cn/practice/1009/ Solution DP+DP 首先,我们可以很轻松地求出所有物品都要的情况下的选择方案数,一个简单的满背包 ...
- luogu p4141 消失之物(背包dp+容斥原理)
题目传送门 昨天晚上学长讲了这题,说是什么线段树分治,然后觉得不可做,但那还不是正解,然后感觉好像好难的样子. 由于什么鬼畜的分治不会好打,然后想了一下$O(nm)$的做法,想了好长时间觉得这题好像很 ...
- 洛谷P4141 消失之物——背包
题目:https://www.luogu.org/problemnew/show/P4141 竟然是容斥:不选 i 物品只需减去选了 i 物品的方案: 范围原来是2*10^3而不是2*103啊... ...
- P4141 消失之物
目录 链接 思路 代码 链接 P4141 消失之物 思路 f[N];//表示删掉物品后能出现容积为i的方案数 a[N];//单纯0-1背包的方案数asd 那么就先求出a[i]来,然后转移就是 if(j ...
- BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )
虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...
- 【BZOJ2287】【POJ Challenge】消失之物 背包动规
[BZOJ2287][POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了 ...
- 洛谷P4141消失之物(背包经典题)——Chemist
题目地址:https://www.luogu.org/problemnew/show/P4141 分析:这题当然可以直接暴力枚举去掉哪一个物品,然后每次暴力跑一遍背包,时间复杂度为O(m*n^2),显 ...
- P4141 消失之物(背包)
传送门 太珂怕了……为什么还有大佬用FFT和分治的…… 首先如果没有不取的限制的话就是一个裸的背包 然后我们考虑一下,正常的转移的话代码是下面这个样子的 ;i<=n;++i) for(int j ...
- 旧题再做【bzoj2287】【[pojchallenge]消失之物】分治背包
(上不了p站我要死了) 今天听了 doggu神 讲了这道题的另一种做法,真是脑洞大开.眼界大开.虽然复杂度比黄学长的要大一点,但不总结一下简直对不起这神思路. 方法1:黄学长的做法(点这里) Desc ...
随机推荐
- vue的基本语法
在学习vue之前,我们应了解一下什么是vue.js? 什么是Vue.js? Vue.js是目前最后一个前端框架,React是最流行的一个前端框架(react除了开发网站,还可以开发手机App,Vue语 ...
- 11.vim常用操作
:set nu在命令模式下显示行号 进入输入模式 新增 (append) a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动. A:从光标所在列最後面的地方开始新增资料. 插入 ...
- 安装 Dashboard 插件
Kubernetes Dashboard 是 k8s集群的一个 WEB UI管理工具,代码托管在 github 上,地址:https://github.com/kubernetes/dashboard ...
- 牛客 201 J Princess Principal (括号, 栈模拟)
大意: 给定序列$a$, $a_i$为偶数代表第$\frac{a_i}{2}$种左括号, 否则为第$\frac{a_i-1}{2}$种右括号. 询问区间是否是合法括号序列. #include < ...
- 数据库优化方案之SQL脚本优化
随着数据库数据越来越大,数据单表存在的数据量也就随之上去了,那么怎么样让我们的脚本查询数据更快呢? 在这个地方我们主要提到两个数据库类型: 1.MSSQL(该数据库我们通过执行计划来查看数据库性能在哪 ...
- 【原创】大叔经验分享(82)logstash一个实例运行多个配置文件
logstash一个实例运行多个配置文件,将所有配置文件放到以下目录即可 /usr/share/logstash/pipeline 但是默认行为不是每个配置文件独立运行,而是作为一个整体,每个inpu ...
- CSS用户界面样式之cursor/outline/resize
1. 鼠标样式cursor 检测鼠标指针在对象上移动的鼠标指针采用何种系统预定于的光标形状 常用属性: default 小白 hands小手 /pointer move移动 text文本 2. 轮廓 ...
- VUE【三、指令】
模板指令 1.数据渲染(对应data数据) {{a}} 当使用v-once指令时,数据会一次绑定,后续修改值不会变化 v-text="a" 等同于{{a}} v-html=&quo ...
- 解决织梦5.7添加新变量出现:Request var not allow!的办法
找到:根目录->include->common.inc.phpif( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_ ...
- docker container 导入和导出
目录 docker container 导入和导出 1.前言 2.docker container 的导出 3.docker container 的导入 4.镜像和容器 导出和导入的区别 docker ...