背包+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的更多相关文章

  1. BZOJ2287 【POJ Challenge】消失之物 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8684027.html 题目传送门 - BZOJ2287 题意 有$n$个物品,第$i$个物品的体积为$w_i$. ...

  2. 【BZOJ2287】【POJ Challenge】消失之物 背包动规

    [BZOJ2287][POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了 ...

  3. [bzoj2287][poj Challenge]消失之物_背包dp_容斥原理

    消失之物 bzoj-2287 Poj Challenge 题目大意:给定$n$个物品,第$i$个物品的权值为$W_i$.记$Count(x,i)$为第$i$个物品不允许使用的情况下拿到重量为$x$的方 ...

  4. bzoj2287【POJ Challenge】消失之物 缺一01背包

    bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...

  5. bzoj2287:[POJ Challenge]消失之物

    思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数.然后统计答案,利用dp. C[i][j]表示不用物品i,组成体积j的方案数. 转移公式:C[i][j]=f[j]-C[i][j-w[i ...

  6. BZOJ2287: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][S ...

  7. BZOJ2287 消失之物

    这题貌似是个权限题qwq,我是用离线题库+本地数据包测的 题目大意: 给你\(n\)个体积分别为\(w[i]\)的物品和容积\(m\),问你将每一件物品分别去掉之后,拼出\(1\)~\(m\)中每一个 ...

  8. BZOJ2287【POJ Challenge】消失之物

    题解: 1.以前见过类似的,可以cdq分治 当l=r时就是还有一个剩余 这样时间是nmlogn的 空间是mlogn 2.首先我们可以dp出表示出j的方案数 令g[i][j]表示不能选i,表示出j的方案 ...

  9. bzoj2287 [POJ Challenge]消失之物

    题目链接 少打个else 调半天QAQ 重点在47行,比较妙 #include<algorithm> #include<iostream> #include<cstdli ...

  10. 2018.11.06 bzoj2287: 【POJ Challenge】消失之物(背包)

    传送门 先假设所有物品都能用,做01背包求出方案数. 然后枚举每个点,分类讨论扣掉它对答案的贡献. 代码: #include<bits/stdc++.h> using namespace ...

随机推荐

  1. html css笔记 -度一

    """浏览器 shell 内核外表 内心 IE tridentFirefox Geckogoogle chrome webkit/blinksafari webkitop ...

  2. PS学习笔记(05)

    PS学习笔记(09) [2]马赛克背景 找一张图片.然后新建图层,让前景色背景色恢复到默认的状态(黑.白) 在新建图层上填充黑色-->滤镜-->渲染->云彩 像素化-->马赛克 ...

  3. 【状压+状态转移】A Famous Airport Managere

    https://www.bnuoj.com/v3/problem_show.php?pid=25653 [题意] 给定一个3*3的九宫格,模拟一个停机坪.第一个格子一定是'*',代表take off ...

  4. Django开发:(3.1)ORM:单表操作

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...

  5. [ C语言 ] 迷宫 迷宫生成器 [ 递归与搜索 ]

    [原创]转载请注明出处 [浙江大学 程序设计专题] [地图求解器] 本题目要求输入一个迷宫地图,输出从起点到终点的路线. 基本思路是从起点(Sx,Sy)每次枚举该格子上下左右四个方向,直到走到终点(T ...

  6. mysql pager用法&命令行命令

    下面讲的命令,有部分只能在linux上才有.像pager命令windows上就没有了. 分屏:在Linux上,而且不是xwindow时,使用mysql命令行时,输出太多的东西,看不到就很悲剧了.在sh ...

  7. bootstrap删除模态框弹出并询问是否删除【通用删除模态框】

    普通的询问是否删除的对话框比较low,可以利用bootstrap的模态框代替普通的对话框来实现删除. 效果: 点删除的时候弹出模态框询问是否删除,点确认的时候将需要删除的ID传到后台进行删除.  过程 ...

  8. The Java library for converting Wikipedia wikitext notation to HTML

    https://code.google.com/p/gwtwiki/ The Java Wikipedia API (Bliki engine) is a parser library for con ...

  9. cogs——1364. 聚会

    1364. 聚会 ★   输入文件:partyb.in   输出文件:partyb.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 小S想要从某地出发去同学k的家中参加 ...

  10. java读取大文本文件

    原文:http://blog.csdn.net/k21325/article/details/53886160 小文件当然可以直接读取所有,然后放到内存中,但是当文件很大的时候,这个方法就行不通了,内 ...