洛谷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的我只能 ...
随机推荐
- LOJ 10239 有趣的数列
LOJ 10239 有趣的数列 首先可以将奇数视作入栈,偶数视作出栈,那么它是卡特兰数,其实打表也能看出来,而且好像可以用dp? 不过这道题的难点不在这里,p不是素数,所以不能用求逆元来做,不过前50 ...
- 12 Top Open Source Data Analytics Apps
1. Hadoop It would be impossible to talk about open source data analytics without mentioning Hadoop. ...
- selenium webdriver学习(二)————对浏览器的简单操作(转载JARVI)
selenium webdriver学习(二)————对浏览器的简单操作 博客分类: Selenium-webdriver selenium webdriver对浏览器的简单操作 打开一个测试浏览 ...
- 2018-7-29-C#-强转会不会抛出异常
title author date CreateTime categories C# 强转会不会抛出异常 lindexi 2018-7-29 14:24:1 +0800 2018-4-4 16:24: ...
- H3C 广域网的作用
- python起个简单web服务器
在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer. 我们可以很简单的使用 python -m SimpleHTTPSer ...
- Python--day47--mysql慢日志记录
- Python--day61--Django的ORM
下载驱动
- mysql导出csv/sql/newTable/txt的方法,mysql的导入txt/sql方法...mysql备份恢复mysqlhotcopy、二进制日志binlog、直接备份文件、备份策略、灾难恢复.....................................................
mysql备份表结构和数据 方法一. Create table new_table_nam备份到新表:MYSQL不支持: Select * Into new_table_name from old_t ...
- navicat for mysql (10038)如何解决
1.授权(youpassword修改为你的密码) #本机登陆mysql: $:mysql -u root -p #改变数据库: mysql>use mysql; #从所有主机: mysql> ...