失踪OJ回归。

  小C通过这道题mark一下容斥一类的问题。

Description

  硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买s的价值的东西。请问每次有多少种付款方法。

Input

  第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s。

Output

  每次的方法数。

Sample Input

  1 2 5 10 2
  3 2 3 1 10
  1000 2 2 2 900

Sample Output

  4
  27

HINT

  di,s<=100000,tot<=1000。

Solution

  O(s*tot)的DP算法谁都会写,但是看着这时间复杂度你难道不虚吗?

  你难道甘愿被卡常而就此丢掉10分或是在刷题时打一个这样的暴力草草了事而对其中的精妙不闻不问,你的良心不会痛吗?

  如果你在解题时看到题目中有常数a(a<20)这样的数据,不妨就往O(2a)这样复杂度的算法去想一想。

  因为题目中有一个常数4,而且还都是限制条件,所以我们就往状压、容斥这方面去想。

  显然状压是不可能的,于是我们就只有容斥了。

  首先我们要知道容斥在这道题是干嘛用的:

  容斥就是对多个限制条件下方案的去重工作,也就是你们所熟知的,求多个集合的并集。

  容斥常常伴随的思想是一种逆向思维,就是题目往往要求我们去求多个集合的交,然而我们并没有好的办法,转而跑去求各个集合的补的并,再补回来就是各个集合的交。

  我们需要理解在这个算法中, 交 是可以O(1)求得的,然而 并 需要用容斥求得。

  所以解这样的题目的大致思路就是:

    题目要求我们求A1~An的交,但是我们发现很难求;

    所以我们去求CuA1~CuAn的并,而CuA1~CuAn的并需要我们求CuA1~CuAn的交,但是我们发现CuA1~CuAn的交特别好求,所以我们就圆满地解决了这个问题。

  运用这样的思路,我们就可以很快解出这道题。

  所以我们要求的只剩,在这次购物中,第 i 种硬币用了超过di的方案数。

  脑补一下,我们就知道,我们只要每种硬币先取到它们限制的数量+1,剩下随便取就可以了,这样的方案无论如何都是满足每种硬币都超过限制的。

  所以用一句话概括题解:容斥,求f[s-Σ(ci*(di+1))],f[x]为在没有任何限制下,取硬币得到面值x的方案数。

  时间复杂度O(max(s)*4+tot*16)。注意答案最大为C(s,4)会爆int。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define MM 100005
using namespace std;
int n,m;
int a[],g[],ys[];
ll f[MM],lt,ans;
bool u; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} int main()
{
register int i,j;
a[]=read(); a[]=read(); a[]=read(); a[]=read(); n=read();
f[]=ys[]=; ys[]=; ys[]=; ys[]=;
for (i=;i<=;++i)
for (j=a[i];j<MM;++j) f[j]+=f[j-a[i]];
while (n--)
{
g[]=read(); g[]=read(); g[]=read(); g[]=read(); m=read();
ans=;
for (i=;i<;++i)
{
for (u=lt=,j=;j<=;++j)
if (i&ys[j]) u^=,lt+=1LL*a[j]*(g[j]+);
if (lt>m) continue;
ans+=(f[m-lt])*(u?-:);
}
printf("%lld\n",ans);
}
}

Last Word

  大概就是小C关于容斥的一点点想法,当然这样的题目还有很多无法以偏概全。希望这样的思路能对以后有一点帮助吧。

[BZOJ]1042 硬币购物(HAOI2008)的更多相关文章

  1. BZOJ 1042 硬币购物(完全背包+DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1042 题意:给出四种面值的硬币c1,c2,c3,c4.n个询问.每次询问用d1.d2.d ...

  2. BZOJ 1042 硬币购物(背包DP+容斥原理)

    可以看出这是个多重背包,运用单调队列优化可以使每次询问达到O(s).这样总复杂度为O(s*tot). 会TLE. 因为改题的特殊性,每个硬币的币值是不变的,变的只是每次询问的硬币个数. 我们不妨不考虑 ...

  3. BZOJ 1042 硬币购物

    先不考虑限制,那么有dp[i]表示i元钱的方案数. 然后考虑限制,发现可以容斥. 其实整个题就是两个容斥原理.感觉出的蛮好的. #include<iostream> #include< ...

  4. 【BZOJ】【1042】【HAOI2008】硬币购物

    DP+容斥原理 sigh……就差一点…… 四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$A\bigcap B\bigc ...

  5. Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1747  Solved: 1015[Submit][Stat ...

  6. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

    题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1706  Solved: 985[Submit][ ...

  7. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  8. BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]

    1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...

  9. 【BZOJ】1042: [HAOI2008]硬币购物

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3307  Solved: 2075[Submit][Stat ...

随机推荐

  1. js的 == 和 ===的区别

    1.对于string,number等基础类型,==和===是有区别的 不同类型间比较,==之比较转化成同一类型后的值看值是否相等,===如果类型不同,其结果就是不等,同类型比较,直接进行"值 ...

  2. 08-TypeScript中的类

    类的概念通常是在后端开发中实现的思想,比如C#.C++或Java,传统的JavaScript开发通过使用原型模式来模拟类的功能.在TypeScript中,天生就是支持类 的,可以让前端的开发更加具有面 ...

  3. FTP传输文件被破坏的问题(Linux、Busybox)

    在网络设备上抓包后,通过FTP传输到本机,发现抓包文件破坏.更换tftp后文件正常,定位问题在FTP上. FTP的传输模式有两种:①ASCII  ②二进制 ①ASCII: 以ASCII编码的方式传输文 ...

  4. MySQL ID排序乱了的解决办法

    可能在整理表中数据的时候删除了某一行数据,导致ID空缺,下面是我用到的解决办法:(请先备份,MySQL备份方法见 MySQL->MySQL备份) 使用ALTER DROP删除原有的ID字段: A ...

  5. linux 进程间通信的3种高级方式及优缺点

    由于不同的进程运行在各自不同的内存空间中.一方对于变量的修改另一方是无法感知的.因此.进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通进程间通信来完成. 根据进程通信时信息量大小的不同, ...

  6. node.js的安装的配置

    一.Node.js 安装配置 Node.js 提供在Windows和Linux上安装 1.  Window 上安装Node.js 64 位安装包下载地址 : https://nodejs.org/di ...

  7. Go语言的核心Routine-Channel

    前言 Go语言通过routine,提供了并发编程的支持. Routine特性 (1) goroutine是Go语言运行库的功能,不是操作系统提供的功能,goroutine不是用线程实现的. 例:启动一 ...

  8. mysql自带的example测试数据库导入Centos6.5

    1.下载数据库 下载地址: [test数据库] (https://github.com/datacharmer/test_db) 不出意外的话,下载下来是个unzip文件. 2.上传到数据库服务器 r ...

  9. Centos6.9minimal安装图形化界面

    有时我们会用到图形化界面来操作,下面介绍是在虚拟机上安装Centos6.9minimal版安装图形化界面(其他系统版本都类似吧,,,),如果是在物理机上安装进入的话要用的远程桌面工具VNC. VNC安 ...

  10. Help Jimmy ~poj-1661 基础DP

    Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落, ...