2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)

https://www.luogu.com.cn/problem/P1450

题意:

共有 44 种硬币。面值分别为 \(c_1,c_2,c_3,c_4\)。

某人去商店买东西,去了 \(n\) 次,对于每次购买,他带了 \(d_i\) 枚 \(i\) 种硬币,想购买 \(s\) 的价值的东西。请问每次有多少种付款方法。

分析:

设有且仅有一种硬币,价值为 \(c\) ,有 \(d\) 枚。现在想买价值为 \(s\) 的东西,在不限硬币个数的情况下的方案数为 \(f_s\) ,超出 \(d\) 枚的方案分别是取 \(d+1\) 枚、取 \(d+2\) 枚、取 \(d+3\) 枚……如果现在强制取 \(d+1\) 枚,那么再往上添一毛钱都不行!因为我们最少就取了 \(d+1\) 枚价值为 \(c\) 的硬币。

\(d+1\) 枚硬币的价值为 \(c*(d+1)\) ,还剩下的价值为 \(s-c*(d+1)\) ,剩下的无论怎么取一定会超过 \(d\) 枚硬币的方案数为 \(f_{s-c*(d+1)}\) 。因为选取价值为 \(c*(d+1)\) 硬币的方案数为 \(1\) ,即选取 \(d+1\) 枚硬币,根据乘法原理得,选取超过 \(d\) 枚硬币大的方案数为

\(ans=1*f_{s-c*(d+1)}=f_{s-c*(d+1)}\) ,

则满足条件的方案数为 \(f_s-ans\) 。

设我们有两种硬币,价值分别为 \(c_i\) 、 \(c_j\) ,分别有 \(d_i\) 枚、 \(d_j\) 枚。现在依旧想买价值为 \(s\) 的东西,超出 \(d_i\) 的方案数为 \(f_{s-c_i*(d_i+1)}\) ,超出 \(d_j\) 的方案数为 \(f_{s-c_j*(d_j+1)}\) 。但是存在即超出 \(d_i\) 又超出 \(d_j\) ,这种情况的方案数为 \(f_{s-c_i*(d_i+1)-c_j*(d_j+1)}\) 。根据容斥原理得,超出的总方案数为

\(tot=f_{s-c_i*(d_i+1)}+f_{s-c_j*(d_j+1)}-f_{s-c_i*(d_i+1)-c_j*(d_j+1)}\) ,

则满足条件的方案数为 \(f_s-tot\) 。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std; #define int long long
const int N=1e5+10;
int n,c[5],num[5],s,f[N]; signed main(){
IOS;
for(int i=1;i<=4;i++)cin>>c[i];
f[0]=1;
for(int i=1;i<=4;i++)for(int j=c[i];j<=N-10;j++)f[j]+=f[j-c[i]];
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=4;j++)cin>>num[j];cin>>s;
int ans=f[s];
for(int k=15;k>0;k--){
int flag=0,ki=k,tot=0,aim=0;
while(ki){
++aim;
if(ki&1)tot+=(num[aim]+1)*c[aim],flag^=1;
ki>>=1;
}
if(tot>s)continue;
if(flag)ans-=f[s-tot];
else ans+=f[s-tot];
}
cout<<ans<<endl;
}
return 0;
}

2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)的更多相关文章

  1. [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥

    题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...

  2. P1450 [HAOI2008]硬币购物(完全背包+容斥)

    P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...

  3. 洛谷—— P1450 [HAOI2008]硬币购物

    P1450 [HAOI2008]硬币购物 硬币购物一共有$4$种硬币.面值分别为$c1,c2,c3,c4$.某人去商店买东西,去了$tot$次.每次带$di$枚$ci$硬币,买$si$的价值的东西.请 ...

  4. 2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)

    2021.12.06 P2511 [HAOI2008]木棍分割(动态规划) https://www.luogu.com.cn/problem/P2511 题意: 有n根木棍, 第i根木棍的长度为 \( ...

  5. 2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ π )

    2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ \(\pi\) ) https://www.luogu.com.cn/problem/P2508 题意: 求一个给定的圆 \( ...

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

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

  7. 洛谷P1450 [HAOI2008]硬币购物

    题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一 ...

  8. P1450 [HAOI2008]硬币购物

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

  9. Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理

    考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...

随机推荐

  1. 程序流程控制1 if 分支机构

            通常,程序结构分为三种,顺序结构,循环结构和分支结构.程序中的语句按照先后顺序执行,成为顺序结构.分支结构则根据测试条件执行不同的代码.循环结构指重复执行相同的代码.Python用if ...

  2. 《前端运维》四、Jenkins--持续构建

    首先,我们先来了解下什么叫做持续构建.持续构建简称CI,负责拉取代码库中的代码后,执行用户预定义的脚本,通过一系列编译操作构建出一个制品,并将制品推送到制品库里.常用的持续构建工具有 Gitlab C ...

  3. C++获取设备 PID,VID 信息

    可直接编译(设置成:使用多字节字符集) 转来的,代码: /* http://www.experts-exchange.com/Programming/Editors_IDEs/Q_24506125.h ...

  4. c#的委托实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. POI Excel索引是从0还是1开始??

    this.workbook.getSheetAt(1).getFirstRowNum() // == 0 this.workbook.getSheetAt(1).getLastRowNum() // ...

  6. zookeeper 是什么?zookeeper 都有哪些功能?

    zookeeper 是什么? ZooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目.ZooKeeper是 ...

  7. java-规约-OOP

    public class OOP { /** * 避免通过一个类的对象引用访问此类的静态变量或者静态方法 * 直接通过类名去访问 */ // 错误使用例子: public static void ma ...

  8. 数组有没有 length()方法?String 有没有 length()方法?

    数组没有 length()方法,有 length 的属性. String 有 length()方法.JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混 ...

  9. innodb和myisam

    在Mysql数据库中,常用的引擎主要就是2个:Innodb和MyIASM.这篇文章将主要介绍这两个引擎,以及该如何去选择引擎,最后在提一下这2种引擎所使用的数据结构是什么. 首先介绍一下Innodb引 ...

  10. mac 修改环境变量bash_profile除了cd用不了其他命令,又关闭了终端

    1.添加命令出错,会导致mac不能使用命令 2.打开终端再添加export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 一条 3.可以使用命令, ...