题意

ftiasch 有 N 个物品, 体积分别是 W1W2, ..., WN。 由于她的疏忽, 第 i 个物品丢失了。 “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了。她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。

Sol

Orz hzwer

这题可能有三种做法吧。。

第一种是分治背包

第二种是NTT优化暴力

第三种是$O(nm)$的神仙dp

这里只说一下第三种

首先设$f[i][j]$表示前$i$个物品选了$j$个,然后就是裸的完全背包

设$cnt[i][x]$表示答案

考虑这玩意儿怎么转移

  1. $cnt[i][0] = 1$
  2. 若$j \le w[i]$,$cnt[i][j] = f[n][j]$
  3. 若$j \geqslant w[i]$,$cnt[i][j] = f[n][j] - cnt[i][j - w[i]]$

第三个的转移非常神仙,反正我是没想出来,我们考虑用总的方案数减去用了改物品的方案数,我们发现直接算不是很好算,然后补集转化一下,用了物品$i$,体积为$j$,那么其他物品的体积为$j - w[i]$,这里的其他物品,也就是不用$i$的情况,也就是原来的$cnt$数组!!好神仙啊qwq

#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
//#define int long long
#define Pair pair<int, int>
#define fi first
#define se second
#define MP(x, y) make_pair(x, y)
using namespace std;
const int MAXN = 1e6 + , mod = ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M;
int w[MAXN], f[][], cnt[][];
main() {
N = read(); M = read();
for(int i = ; i <= N; i++) w[i] = read();
f[][] = ;
for(int i = ; i <= N; i++) {
for(int j = ; j <= M; j++) {
(f[i][j] += f[i - ][j]) %= mod;//不装
if(j >= w[i]) (f[i][j] += f[i - ][j - w[i]]) %= mod;
}
}
for(int i = ; i <= N; i++) {
cnt[i][] = ;
for(int j = ; j <= M; j++) {
if(j < w[i]) cnt[i][j] = f[N][j] % mod;
else cnt[i][j] = (f[N][j] - cnt[i][j - w[i]] + mod) % mod;
}
}
for(int i = ; i <= N; i++, puts(""))
for(int j = ; j <= M; j++)
printf("%d", cnt[i][j] % mod);
return ;
}
/*
3 2
1 1 2
*/

BZOJ2287: 【POJ Challenge】消失之物(背包dp)的更多相关文章

  1. 【bzoj2287】[POJ Challenge]消失之物 背包dp

    题目描述 ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢? ...

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

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

  3. bzoj2287 [POJ Challenge]消失之物

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

  4. BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )

    虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...

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

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

  6. BZOJ.2287.[POJ Challenge]消失之物(退背包)

    BZOJ 洛谷 退背包.和原DP的递推一样,再减去一次递推就行了. f[i][j] = f[i-1][j-w[i]] + f[i-1][j] f[i-1][j] = f[i][j] - f[i-1][ ...

  7. POJ Challenge消失之物

    Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. "要使用剩下的 N - 1 物品装满容积为 x ...

  8. 【bozj2287】【[POJ Challenge]消失之物】维护多值递推

    (上不了p站我要死了) Description ftiasch 有 N 个物品, 体积分别是 W1, W2, -, WN. 由于她的疏忽, 第 i 个物品丢失了. "要使用剩下的 N - 1 ...

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

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

随机推荐

  1. 牛客练习赛34-C-little w and Segment Coverage(差分数组)

    链接:https://ac.nowcoder.com/acm/contest/297/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. 瓷砖覆盖(状压DP)

    题目描述 Description 用1*2的瓷砖去铺N*M的地面,问有多少种铺法 输入描述 Input Description 第一行有两数n,m.表示地面的大小 输出描述 Output Descri ...

  3. Jmeter的BeanShell中报错:调用bsh方法时出错Error invoking bsh method: eval

    报错内容:ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval In file: inline evalu ...

  4. Hive MetaStore Upgrade

    # cd $HIVE_HOME/scripts/metastore/upgrade/mysql [Dev root @ sd-9c1f-2eac /usr/local/src/apache-hive- ...

  5. AJAX下拉框联动

    function getProvince() { var ProName = $("#dvProv").val(); LoadProvince(ProName); } functi ...

  6. c++的直接初始化与复制初始化 未完成!!!!!!!!!!!!

    直接初始化:是直接调用类的构造函数进行初始化.如下: string a;//调用默认构造函数 string a("hello");//调用参数为 const char* 类型的构造 ...

  7. formatter 操作列表的合并

    {field:'22',title:'操作',width:250,align:'center',sortable:true,formatter : function(value, row, index ...

  8. 基于nginx的FastCGI的缓存配置

    废话不多说了, 直接上配置, 其实 fastcgi_cache 和 proxy_cache 的配置基本一样: # !缓存文件存放目录 # levels 缓存层次 # keys_zone 缓存空间名和共 ...

  9. 如何远程连接非默认端口SQL Server

    SQL Server Management Studio建立远程SQL连接  连接的时候写: 127.0.0.1,49685\sqlexpress 记得使用逗号,不是冒号

  10. JS文本框输入限制

    1上面的文本框只能输入数字代码(小数点也不能输入): CODE: <input onkeyup="this.value=this.value.replace(/\D/g,'')&quo ...