题目链接:https://www.luogu.com.cn/problem/P4141

题目大意:

有 \(n\) 件物品,求第 \(i\) 件物品不能选的时候(\(i\) 从 \(1\) 到 \(n\))0-1背包方案数。

解题思路:

传统方法

遍历每一遍不选的物品,然后对剩余的物品求01背包方案数。

时间复杂度为 \(O(n^2m)\) 。

由于这里每一件物品的价值和时间相同,

所以可以定义状态 \(f[i]\) 表示填满体积 \(i\) 的方案数。

则有状态转移方程:

\(f[0] = 1\)

\(f[i] = \sum f[i-c]\) (其中 \(c\) 对应每一件物品的体积)

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
int n, V, w[maxn], f[maxn];
void pack(int c) {
for (int i = V; i >= c; i --)
f[i] = (f[i] + f[i-c]) % 10;
}
void solve(int id) {
memset(f, 0, sizeof(f));
f[0] = 1;
for (int i = 0; i < n; i ++) {
if (i == id) continue;
pack(w[i]);
}
for (int i = 1; i <= V; i ++) cout << f[i];
cout << endl;
}
int main() {
cin >> n >> V;
for (int i = 0; i < n; i ++) cin >> w[i];
for (int i = 0; i < n; i ++) solve(i);
return 0;
}

优化

转载自 Kelin大神的博客

其实只要跑一次背包(全部物品都在)

然后我们考虑少了某个物品怎么办?

我们在01背包DP时会用到这个转移

for(int j=m;j>=w[i];--j)
f[j]+=f[j-w[i]];

我们少了i物品就是在原来的基础上少了一次这样的转移

所以我们在原来的基础上顺推减去这样的一次转移就ok了

memcpy(g,f,sizeof f);
for(int j=w[i];j<=m;++j)
g[j]-=g[j-w[i]];

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
int n, V, w[maxn], f[maxn], g[maxn];
void pack(int c) {
for (int i = V; i >= c; i --)
f[i] = (f[i] + f[i-c]) % 10;
}
void unpack(int c) {
memcpy(g, f, sizeof(f));
for (int i = c; i <= V; i ++)
g[i] = (g[i] - g[i-c] + 10) % 10;
}
void init() {
memset(f, 0, sizeof(f));
f[0] = 1;
for (int i = 0; i < n; i ++) {
pack(w[i]);
}
}
void solve(int id) {
unpack(w[id]);
for (int i = 1; i <= V; i ++) cout << g[i];
cout << endl;
}
int main() {
cin >> n >> V;
for (int i = 0; i < n; i ++) cin >> w[i];
init();
for (int i = 0; i < n; i ++) solve(i);
return 0;
}

洛谷P4141 消失之物 题解 背包问题扩展的更多相关文章

  1. 洛谷P4141 消失之物——背包

    题目:https://www.luogu.org/problemnew/show/P4141 竟然是容斥:不选 i 物品只需减去选了 i 物品的方案: 范围原来是2*10^3而不是2*103啊... ...

  2. 洛谷P4141消失之物(背包经典题)——Chemist

    题目地址:https://www.luogu.org/problemnew/show/P4141 分析:这题当然可以直接暴力枚举去掉哪一个物品,然后每次暴力跑一遍背包,时间复杂度为O(m*n^2),显 ...

  3. [洛谷P4141] 消失之物「背包DP」

    暴力:暴力枚举少了哪个,下面套一个01背包 f[i][j]表示到了i物品,用了j容量的背包时的方案数,f[i][j]=f[i-1][j]+f[i-1][j-w[i]]O(n^3) 优化:不考虑消失的, ...

  4. 洛谷P4141消失之物

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

  5. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  6. P4141 消失之物

    目录 链接 思路 代码 链接 P4141 消失之物 思路 f[N];//表示删掉物品后能出现容积为i的方案数 a[N];//单纯0-1背包的方案数asd 那么就先求出a[i]来,然后转移就是 if(j ...

  7. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  8. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  9. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

随机推荐

  1. Android 高仿QQ滑动弹出菜单标记已读、未读消息

    在上一篇博客<Android 高仿微信(QQ)滑动弹出编辑.删除菜单效果,增加下拉刷新功能>里,已经带着大家学习如何使用SwipeMenuListView这一开源库实现滑动列表弹出菜单,接 ...

  2. BERT-Pytorch demo初探

    https://zhuanlan.zhihu.com/p/50773178 概述 本文基于 pytorch-pretrained-BERT(huggingface)版本的复现,探究如下几个问题: py ...

  3. 2018-11-19-Roslyn-NameSyntax-的-ToString-和-ToFullString-的区别

    title author date CreateTime categories Roslyn NameSyntax 的 ToString 和 ToFullString 的区别 lindexi 2018 ...

  4. H3C 广域网的作用

  5. Python--day68--Django ORM常用字段、不常用的字段、自定义字段

    ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...

  6. hdu 3466 Proud Merchants(有排序的01背包)

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  7. Codeforces Round #170 (Div. 1 + Div. 2)

    A. Circle Line 考虑环上的最短距离. B. New Problem \(n\) 个串建后缀自动机. 找的时候bfs一下即可. C. Learning Languages 并查集维护可以沟 ...

  8. www的iptables实例

    #!/bin/bash export PATH=/sbin:/usr/sbin:/bin:/usr/bin #加载相关模块 modprobe iptable_nat modprobe ip_nat_f ...

  9. 纯JS前端分页方法(JS分页)

    1.JS分页函数:开发过程中,分页功能一般是后台提供接口,前端只要传page(当前页码)和pageSize(每页最大显示条数)及对应的其他查询条件,就可以返回所需分页显示的数据. 但是有时也需要前端本 ...

  10. H3C 配置Basic NAT