bzoj2287
背包+fft
既然要不选一个东西,那么我们求出前缀背包和后缀背包,每次答案就是f[i-1][w]*g[i+1][j-w]
但是这样复杂度还是n^3,跑不过,但是我们发现上面那个东西不就是个裸卷积吗,直接上fft,但是wa了...
wa的程序,大概是精度问题吧
#include<bits/stdc++.h>
using namespace std;
#define pi acos(-1)
const int N = ;
int n, m, L, x, nn, mm;
int r[N * ], f[N][N], g[N][N], w[N];
complex<double> a[N * ], b[N * ];
void fft(complex<double> *a, int f)
{
for(int i = ; i < n; ++i) if(i < r[i]) swap(a[i], a[r[i]]);
for(int i = ; i < n; i <<= )
{
complex<double> t(cos(pi / i), f * sin(pi / i));
for(int p = i << , j = ; j < n; j += p)
{
complex<double> w(, );
for(int k = ; k < i; ++k, w *= t)
{
complex<double> x = a[j + k], y = w * a[j + k + i];
a[j + k] = x + y; a[j + k + i] = x - y;
}
}
}
}
int main()
{
scanf("%d%d", &nn, &mm);
for(int i = ; i <= nn; ++i) scanf("%d", &w[i]);
f[][] = ;
for(int i = ; i <= nn; ++i)
for(int j = ; j <= mm; ++j)
{
f[i][j] = f[i - ][j];
if(j >= w[i]) f[i][j] = (f[i][j] + f[i - ][j - w[i]]) % ;
}
g[nn + ][] = ;
for(int i = nn; i; --i)
for(int j = ; j <= mm; ++j)
{
g[i][j] = g[i + ][j];
if(j >= w[i]) g[i][j] = (g[i][j] + g[i + ][j - w[i]]) % ;
}
for(int i = ; i <= nn; ++i)
{
for(int j = ; j <= mm; ++j)
{
L = ;
m = * j + ;
for(int k = ; k <= m; ++k) a[k] = b[k] = ;
for(int k = ; k <= j; ++k)
{
a[k] = f[i - ][k];
b[k] = g[i + ][k];
}
for(n = ; n <= m; n <<= ) ++L;
for(int k = ; k < n; ++k) r[k] = (r[k >> ] >> ) | ((k & ) << (L - ));
fft(a, );
fft(b, );
for(int k = ; k <= n; ++k) a[k] = a[k] * b[k];
fft(a, -);
int ans = (int)(a[j].real() / (double)n + 0.5);
printf("%d", ans % );
}
puts("");
}
return ;
}
写了一个正解
f[i]:装满i的方案数
c[i][j]:装满j不用i的方案数
j<w[i],自然c[i][j]=f[j],因为w[i]装不下,不可能选
j>=w[i],c[i][j]=f[j]-c[i][j-w[i]],在j-w[i]填上一个w[i]就是j,表示选到第i个物品一定选了i的方案数,相减就是不选的方案数
#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n, m;
int w[N], c[N], f[N];
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i) scanf("%d", &w[i]);
f[] = ;
for(int i = ; i <= n; ++i)
for(int j = m; j >= w[i]; --j)
f[j] = (f[j] + f[j - w[i]]) % ;
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
if(j >= w[i]) c[j] = (f[j] - c[j - w[i]] % + ) % ;
else c[j] = f[j];
if(j > ) printf("%d", c[j]);
}
puts("");
}
return ;
}
bzoj2287的更多相关文章
- BZOJ2287 【POJ Challenge】消失之物 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8684027.html 题目传送门 - BZOJ2287 题意 有$n$个物品,第$i$个物品的体积为$w_i$. ...
- 【BZOJ2287】【POJ Challenge】消失之物 背包动规
[BZOJ2287][POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了 ...
- [bzoj2287][poj Challenge]消失之物_背包dp_容斥原理
消失之物 bzoj-2287 Poj Challenge 题目大意:给定$n$个物品,第$i$个物品的权值为$W_i$.记$Count(x,i)$为第$i$个物品不允许使用的情况下拿到重量为$x$的方 ...
- bzoj2287【POJ Challenge】消失之物 缺一01背包
bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...
- bzoj2287:[POJ Challenge]消失之物
思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数.然后统计答案,利用dp. C[i][j]表示不用物品i,组成体积j的方案数. 转移公式:C[i][j]=f[j]-C[i][j-w[i ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- BZOJ2287 消失之物
这题貌似是个权限题qwq,我是用离线题库+本地数据包测的 题目大意: 给你\(n\)个体积分别为\(w[i]\)的物品和容积\(m\),问你将每一件物品分别去掉之后,拼出\(1\)~\(m\)中每一个 ...
- BZOJ2287【POJ Challenge】消失之物
题解: 1.以前见过类似的,可以cdq分治 当l=r时就是还有一个剩余 这样时间是nmlogn的 空间是mlogn 2.首先我们可以dp出表示出j的方案数 令g[i][j]表示不能选i,表示出j的方案 ...
- bzoj2287 [POJ Challenge]消失之物
题目链接 少打个else 调半天QAQ 重点在47行,比较妙 #include<algorithm> #include<iostream> #include<cstdli ...
- 2018.11.06 bzoj2287: 【POJ Challenge】消失之物(背包)
传送门 先假设所有物品都能用,做01背包求出方案数. 然后枚举每个点,分类讨论扣掉它对答案的贡献. 代码: #include<bits/stdc++.h> using namespace ...
随机推荐
- 新进Linux菜鸟,请多多关照
早早知晓Linux的大名,一直未研究学习,近来看了kernel一些源代码,在网上搜过很多基础的知识.感觉这个Linux的世界很广大,值得好好深入学习.初生婴儿,呱呱落地,必先躺若干日后能坐,在学爬,进 ...
- 早期创业,应该充分利用互联网产品和服务(从”皇包车”看一家全球中文车导服务平台如何选用ToB产品)
前段时间,在搜索"皇包车"相关的资料,于是在IT桔子网站看到了"从'皇包车'看一家全球中文车导服务平台如何选用ToB产品"这篇文章. 我是非常的震撼! ...
- layer弹层content写错导致div复制了一次,导致id失效 $().val() 获取不到dispaly:none div里表单的值
错误之源: $("a.consult").click(function () { lib_consult_html = $('#consult-html').h ...
- 2014-4-5安装python以及基础知识
1.下载安装 从python官网下载python2.7.6 https://www.python.org/download/releases/2.7.6 建议用迅雷下载 会比较快 2.交互式解释器 运 ...
- Excel表格如何设置密码 Excel2003/2007/2010设置密码教程
http://www.wordlm.com/special/2/ 经常使用Excel表格制作报表和一些数据后,我们会给Excel表格设置密码,这样可以很有效的防止数据被盗取.目前Office版本众多, ...
- MyChrome制作Chrome浏览器便携版
Google Chrome官方离线下载地址: https://api.shuax.com/tools/getchrome MyChrome下载地址: http://code.taobao.org/p/ ...
- 【NOIP2017练习】怎样打好隔膜(贪心,堆,带删除priority_queue)
题意:OI大师抖儿在夺得银牌之后,顺利保送pku.这一天,抖儿问长者:“我的手速虽然已经站在了人类的巅峰,但是打隔膜还是输.我换了很多队友,但是没有用.请问应该怎样打好隔膜?”长者回答:“你啊,Too ...
- Linux下汇编语言学习笔记13 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- CodeForces - 812C Sagheer and Nubian Market 二分
On his trip to Luxor and Aswan, Sagheer went to a Nubian market to buy some souvenirs for his friend ...
- CentOS7下安装单机版RabbitMQ及权限赋予
RabbitMQ官网rpm软件包地址:https://www.rabbitmq.com/releases/ 一.安装环境: CentOS7.erlang-19.0.4-1.el7.centos.x86 ...