洛谷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的我只能 ...
随机推荐
- oracle函数 end
[功能]当:<表达式>=<表达式条件值1……n> 时,返回对应 <满足条件时返回值1……n> 当<表达式条件值1……n>不为条件表达式时,与函数deco ...
- @bzoj - 3836@ [Poi2014]Tourism
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个n个点,m条边的无向图,其中你在第i个点建立旅游站点的费 ...
- webpack详述
一.利用package.json执行打包任务 首先使用npm init生成package.json文件:然后配置scripts如下: "scripts": { "buil ...
- python 直接if判断和is not None的区别
tmpName = ''if tmpName: print tmpName #没有输出if tmpName is not None: print tmpName #有输出,是空行
- H3C 分页显示
- 传说中Python最难理解的点|看这完篇就够了(装饰器)
https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ 1.什么是装饰器 网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 每个人都有的内裤主要是 ...
- swiper仿tab栏切换
转载 https://developers.weixin.qq.com/community/develop/article/doc/000040a5dc4518005d2842fdf51c13 小程 ...
- spark sql thrift server
### create data ## cat ## echo "$(date ;echo ## cat }'";exit}' ..} do passwd) echo "$ ...
- P1144 最短路计数 题解 最短路应用题
题目链接:https://www.luogu.org/problem/P1144 其实这道题目是最短路的变形题,因为数据范围 \(N \le 10^6, M \le 2 \times 10^6\) , ...
- H3C TCP连接的建立