消失之物(背包DP)(容斥或分治)
容斥做法:
首先n^2搞出f[i][j]第i个物品,j体积的方案数。
去除每个物品贡献:
设个g[i][j]表示当i不选,j体积方案数(注意不是此时的范围相对于全局,而不是1---i)
那么我们用到一些容斥的思想
g[i][j]=f[n][j]-g[i][j-w[i]]
因为g[i][j-w[i]]即可表示当i选时的方案数(都是相对于全局的)
而且注意枚举顺序,我们要用当前g[i]的状态更新之后个g[i]的状态,
而且在j<w[i]的情况下g[i][j]=f[n][j]
注意取模.....
1 #include<map>
2 #include<iostream>
3 #include<cstdio>
4 #include<cstring>
5 #include<algorithm>
6 #include<cmath>
7 #include<string>
8 #include<vector>
9 #define MAXN 4101
10 #define int long long
11 using namespace std;
12 int f[MAXN][MAXN];
13 int g[MAXN][MAXN];
14 int n=0,w[MAXN];
15 int sum=0;
16 signed main()
17 {
18 scanf("%lld%lld",&n,&sum);
19 for(int i=1;i<=n;++i)
20 {
21 scanf("%lld",&w[i]);
22 }
23 f[0][0]=1;
24 for(int i=1;i<=n;++i)
25 {
26 for(int j=sum;j>=0;--j)
27 {
28 f[i][j]=f[i-1][j];
29 }
30 for(int j=sum;j>=w[i];--j)
31 {
32 f[i][j]=(f[i][j]+f[i-1][j-w[i]]+10)%10;
33 }
34 }
35 for(int i=1;i<=n;++i)
36 {
37 for(int j=0;j<=w[i]-1;++j)
38 {
39 g[i][j]=(f[n][j]+10)%10;
40 }
41 for(int j=w[i];j<=sum;++j)
42 {
43 g[i][j]=(f[n][j]-g[i][j-w[i]]+10)%10;
44 }
45 }
46 for(int i=1;i<=n;++i)
47 {
48 for(int j=1;j<=sum;++j)
49 {
50 printf("%lld",(g[i][j]+10)%10);
51 }
52 printf("\n");
53 }
54 }
分治:
%%%%skyh,非常强的思路
我们按照分治的做法,其实每一次我们只是不选其中的一件物品,其余不变,
那么我们利用这个性质,只用除了自身以外的物品更新当前答案
让我们想起树的结构,把叶子节点当作询问,
只需要每次递归左右区间,查询叶子节点时,左右都已经更新答案
回溯时重新更新
1 #include<iostream>
2 #include<cstdio>
3 #define int short
4 using namespace std;
5 const int N=2010;
6 int n,m,w[N],dp[15][N];
7 inline void add(int &a,int b){
8 a+=b;
9 if(a>=10) a-=10;
10 }
11 void solve(int dep,int l,int r){
12 if(l==r){
13 for(int i=1;i<=m;++i) printf("%hd",dp[dep-1][i]);
14 puts("");
15 return ;
16 }
17 int mid=l+r>>1;
18 for(int i=0;i<=m;++i) dp[dep][i]=dp[dep-1][i];
19 for(int i=mid+1;i<=r;++i) for(int j=m;j>=w[i];--j) add(dp[dep][j],dp[dep][j-w[i]]);
20 solve(dep+1,l,mid);
21 for(int i=0;i<=m;++i) dp[dep][i]=dp[dep-1][i];
22 for(int i=l;i<=mid;++i) for(int j=m;j>=w[i];--j) add(dp[dep][j],dp[dep][j-w[i]]);
23 solve(dep+1,mid+1,r);
24 }
25 signed main(){
26 scanf("%hd%hd",&n,&m);
27 for(int i=1;i<=n;++i) scanf("%hd",&w[i]);
28 dp[0][0]=1; solve(1,1,n);
29 return 0;
30 }
%%%skyh
消失之物(背包DP)(容斥或分治)的更多相关文章
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )
虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...
- 【bzoj2287】[POJ Challenge]消失之物 背包dp
题目描述 ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢? ...
- BZOJ2287: 【POJ Challenge】消失之物(背包dp)
题意 ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” ...
- bzoj 3622 DP + 容斥
LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...
- 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 94 Solved: 53 Description 废话不多说,反正小w要发喜 ...
- BZOJ 2287 【POJ Challenge】消失之物(DP+容斥)
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 986 Solved: 572[Submit][S ...
- [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)
先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...
- HDU 5838 (状压DP+容斥)
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
随机推荐
- liunx服务器安装jdk
1.官网下载需要版本的jdk,官网地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.h ...
- Unity动态构建mesh绘制多边形算法流程分析和实践
前言 先说一下,写这篇博文的动机,原文的博主代码写的十分潇洒,以至于代码说明和注释都没有,最近恰逢看到,所以以此博文来分析其中的算法和流程 参考博文:https://blog.csdn.net/lin ...
- Sping AOP
Sping AOP 1.什么是AOP 面向切面编程(AOP) 是 面向对象编程的补充(OOP) 传统的业务处理代码中,通常会惊醒事务处理.日志处理等操作.虽然可以使用OOP的组合或继承来实现代码重用, ...
- 2021年有哪些优秀的免费PSD样机素材下载的网站?
2021年有哪些优秀的免费PSD样机素材下载的网站? 无论是ui设计师还是平面设计师,为避免无休止的加班,平时就需要寻找并收藏一些优秀的设计素材网站.好的素材可以帮助设计师设计作品起到事半功倍的效果, ...
- Jmeter(一) - 从入门到精通 - 环境搭建(详解教程)
1.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...
- 克鲁斯卡尔(Kruskal)算法
概览 相比于普里姆算法(Prim算法),克鲁斯卡尔算法直接以边为目标去构建最小生成树.从按权值由小到大排好序的边集合{E}中逐个寻找权值最小的边来构建最小生成树,只要构建时,不会形成环路即可保证当边集 ...
- 29.Map,可变参数
1.Map集合 1.1Map集合概述和特点[理解] 单列集合一次存一个元素 双列集合一次存两个元素 键:不能重复的 值:可以重复的 Map集合概述 interface Map<K, ...
- [bug] 前台表单添加数据,后台返回成功消息,但数据库相应字段值为null
原因 前端代码中输入框字段值和后端定义的属性值不一致 分析 bean . controller 如下图,浏览器收到后台返回消息,在后台也可打印user信息,说明已成功接收前端JSON数据并转换为use ...
- ms5611-01ba03 气压传感器 中英文 数据手册
中文: https://wenku.baidu.com/view/6f8a861fff00bed5b9f31d53.html 英文: https://wenku.baidu.com/view/fe93 ...
- C 语言通用模板队列
前言 嵌入式开发过程中,各个模块之间,各个设备之间进行交互时,都会存在数据的输入输出,由于处理的方式不同,数据不会立即同步处理,因此通常在设计时都会设计缓冲区进行数据的处理,方式数据丢失等问题:一个项 ...