[bzoj2287]消失之物 题解(背包dp)
2287: 【POJ Challenge】消失之物
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1138 Solved: 654
[Submit][Status][Discuss]
Description
ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN。 由于她的疏忽, 第 i 个物品丢失了。 “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了。她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。
Input
第1行:两个整数 N (1 ≤ N ≤ 2 × 103) 和 M (1 ≤ M ≤ 2 × 103),物品的数量和最大的容积。
第2行: N 个整数 W1, W2, ..., WN, 物品的体积。
Output
一个 N × M 的矩阵, Count(i, x)的末位数字。
Sample Input
1 1 2
Sample Output
11
21
HINT
如果物品3丢失的话,只有一种方法装满容量是2的背包,即选择物品1和物品2。
好久没有做水题了。
首先考虑暴力怎么做:跑n遍背包,如果轮到某个物品丢失就在外层循环到它的时候直接continue(可得90分的好成绩)
#include<cstdio>
#include<iostream>
#include<cstring>
#define re register
using namespace std;
const int N=;
int n,m,dp[N][N],w[N];
inline void mod(int &x)
{
if(x>)x-=;
}
int main()
{
scanf("%d%d",&n,&m);
for(re int i=;i<=n;i++)
scanf("%d",&w[i]);
for(re int now=;now<=n;now++)
{
dp[now][]=;
for(re int i=;i<=n;i++)
{
if(i==now)continue;
for(int j=m;j>=w[i];j--)
mod(dp[now][j]+=dp[now][j-w[i]]);
}
}
for(re int i=;i<=n;i++)
{
for(re int j=;j<=m;j++)
printf("%d",dp[i][j]%);
printf("\n");
}
return ;
}
之所以会T是因为它算了很多次相同的部分,那么考虑如果只跑一次背包,之后对于每个物品丢失时怎么得到答案
很简单,减去丢失物品的贡献就好了。
#include<cstdio>
#include<iostream>
#include<cstring>
#define re register
using namespace std;
typedef long long ll;
const int N=;
int n,m,w[N];
int dp[N],ans[N];
int main()
{
scanf("%d%d",&n,&m);
for(re int i=;i<=n;i++)
scanf("%d",&w[i]);
dp[]=;
for(int i=;i<=n;i++)
for(int j=m;j>=w[i];j--)
(dp[j]+=dp[j-w[i]])%=;
for(int i=;i<=n;i++)
{
memcpy(ans,dp,sizeof(dp));
for(int j=w[i];j<=m;j++)
ans[j]=(ans[j]-ans[j-w[i]]+)%;
for(int j=;j<=m;j++)
printf("%d",(ans[j]+)%);
puts(" ");
}
return ;
}
[bzoj2287]消失之物 题解(背包dp)的更多相关文章
- [洛谷P4141] 消失之物「背包DP」
暴力:暴力枚举少了哪个,下面套一个01背包 f[i][j]表示到了i物品,用了j容量的背包时的方案数,f[i][j]=f[i-1][j]+f[i-1][j-w[i]]O(n^3) 优化:不考虑消失的, ...
- luogu p4141 消失之物(背包dp+容斥原理)
题目传送门 昨天晚上学长讲了这题,说是什么线段树分治,然后觉得不可做,但那还不是正解,然后感觉好像好难的样子. 由于什么鬼畜的分治不会好打,然后想了一下$O(nm)$的做法,想了好长时间觉得这题好像很 ...
- 消失之物(背包DP)(容斥或分治)
容斥做法: 首先n^2搞出f[i][j]第i个物品,j体积的方案数. 去除每个物品贡献: 设个g[i][j]表示当i不选,j体积方案数(注意不是此时的范围相对于全局,而不是1---i) 那么我们用到一 ...
- [bzoj2287][poj Challenge]消失之物_背包dp_容斥原理
消失之物 bzoj-2287 Poj Challenge 题目大意:给定$n$个物品,第$i$个物品的权值为$W_i$.记$Count(x,i)$为第$i$个物品不允许使用的情况下拿到重量为$x$的方 ...
- bzoj2287【POJ Challenge】消失之物(退背包)
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 657 Solved: 382[Submit][S ...
- 洛谷P4141 消失之物 题解 背包问题扩展
题目链接:https://www.luogu.com.cn/problem/P4141 题目大意: 有 \(n\) 件物品,求第 \(i\) 件物品不能选的时候(\(i\) 从 \(1\) 到 \(n ...
- 2018.11.06 bzoj2287: 【POJ Challenge】消失之物(背包)
传送门 先假设所有物品都能用,做01背包求出方案数. 然后枚举每个点,分类讨论扣掉它对答案的贡献. 代码: #include<bits/stdc++.h> using namespace ...
- 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][ ...
- P4141 消失之物(背包)
传送门 太珂怕了……为什么还有大佬用FFT和分治的…… 首先如果没有不取的限制的话就是一个裸的背包 然后我们考虑一下,正常的转移的话代码是下面这个样子的 ;i<=n;++i) for(int j ...
随机推荐
- sql 基础语法 alter用法和视图,透视
--查询没有被删除的学生 alter table StuInfo --修改列属性 alter column isdelete bit null alter table StuInfo --删除列 dr ...
- 用 GetEnvironmentVariable 获取常用系统环境变量
以前曾用 GetWindowsDirectory.GetSystemDirectory.GetTempPath 等函数获取系统常用文件夹; 也用过 SHGetSpecialFolderLocation ...
- c++ 获取文件图标,类型名称,属性 SHGetFileInfo
SHGetFileInfo是一个相当实用的Windows API函数. // [MoreWindows工作笔记4] 获取文件图标,类型名称,属性 SHGetFileInfo #include < ...
- 从输入 URL 到页面展示,到底发生了什么
从输入 URL 到页面展示,到底发生了什么 1.输入URL 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应 ...
- 机器学习之KNN---k最近邻算法-机器学习
KNN算法是机器学习中入门级算法,属于监督性学习算法.SupervisedLearning. 通过Plinko游戏来介绍该算法. 就是随机在上面投球,然后球进下面的哪个地方就得多少分. 然后在规定得投 ...
- python find()函数
实例(Python 2.0+) str1 = "this is string example....wow!!!"; str2 = "exam"; print ...
- Windows下 wamp下Apache配置虚拟域名
安装好wamp后 找到 找到 Include conf/extra/httpd-vhosts.conf 去掉前面的# 并保存 修改 DocumentRoot 和 ServerName ...
- Tomcat负载均衡、调优核心应用进阶学习笔记(五):Tomcat调优和Tomcat监控(差评)
文章目录 tomcat调优 tomcat监控 tomcat调优 vi catalina.sh # --------------------------------------------------- ...
- SQL Server2012创建连接服务器到ORACLE11G
做ETL,肯定少不了经常会从不同的数据库直接进行数据的操作,为了更好的进行跨库操作,SQL SERVER 2012拥有LinkedServer功能.前段时间写了个SQL SERVER同种数据库直接的链 ...
- redis zset 介绍
$key = 'key'; //新增 zadd($key,分数,标识) //删除某个标识 zrem($key,标识) //查询某个标识的排名(从0开始的 所有在输出的时候要加一) zrevrank($ ...