洛谷P4141 消失之物 题解 背包问题扩展
题目链接: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 消失之物 题解 背包问题扩展的更多相关文章
- 洛谷P4141 消失之物——背包
题目:https://www.luogu.org/problemnew/show/P4141 竟然是容斥:不选 i 物品只需减去选了 i 物品的方案: 范围原来是2*10^3而不是2*103啊... ...
- 洛谷P4141消失之物(背包经典题)——Chemist
题目地址:https://www.luogu.org/problemnew/show/P4141 分析:这题当然可以直接暴力枚举去掉哪一个物品,然后每次暴力跑一遍背包,时间复杂度为O(m*n^2),显 ...
- [洛谷P4141] 消失之物「背包DP」
暴力:暴力枚举少了哪个,下面套一个01背包 f[i][j]表示到了i物品,用了j容量的背包时的方案数,f[i][j]=f[i-1][j]+f[i-1][j-w[i]]O(n^3) 优化:不考虑消失的, ...
- 洛谷P4141消失之物
题目描述 ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- P4141 消失之物
目录 链接 思路 代码 链接 P4141 消失之物 思路 f[N];//表示删掉物品后能出现容积为i的方案数 a[N];//单纯0-1背包的方案数asd 那么就先求出a[i]来,然后转移就是 if(j ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
随机推荐
- oralce 分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上. “同时 ...
- HTML的基本结构和标签分类
HTML:超文本标记语言 HTML基本结构 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- 洛谷P4136 谁能赢呢? 题解 博弈论
题目链接:https://www.luogu.org/problem/P4136 找规律 首先这道题目我没有什么思路,所以一开始想到的是通过搜索来枚举 \(n\) 比较小的时候的情况. 所以我开搜索枚 ...
- poj 1514 Metal Cutting (dfs+多边形切割)
1514 -- Metal Cutting 一道类似于半平面交的题. 题意相当简单,给出一块矩形以及最后被切出来的的多边形各个顶点的位置.每次切割必须从一端切到另一端,问切出多边形最少要切多长的距离. ...
- 2018-8-10-用-sim-卡加密保护资金
title author date CreateTime categories 用 sim 卡加密保护资金 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17 ...
- linux 分配和释放设备编号
在建立一个字符驱动时你的驱动需要做的第一件事是获取一个或多个设备编号来使用. 为 此目的的必要的函数是 register_chrdev_region, 在 <linux/fs.h>中声明: ...
- P1028 过河问题
题目描述 为了躲避黑暗大魔王的追杀,zifeiy与他的伙伴们共N人连夜逃出了黑暗城堡,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T ...
- 2018-8-10-win10-uwp-商业游戏-1.2.1
title author date CreateTime categories win10 uwp 商业游戏 1.2.1 lindexi 2018-08-10 19:16:50 +0800 2018- ...
- Activiti工作流引擎学习(一)
1.部署对象和流程定义相关表:RepositoryService act_re_deployment: 部署对象表:一次部署的多个文件的信息,对于不需要的流程可以删除和修改 act_re_procde ...
- Apache工具集
commons-collections-3.2.jar 转自:http://www.open-open.com/lib/view/open1384437456993.html