2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)
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)的更多相关文章
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- P1450 [HAOI2008]硬币购物(完全背包+容斥)
P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...
- 洛谷—— P1450 [HAOI2008]硬币购物
P1450 [HAOI2008]硬币购物 硬币购物一共有$4$种硬币.面值分别为$c1,c2,c3,c4$.某人去商店买东西,去了$tot$次.每次带$di$枚$ci$硬币,买$si$的价值的东西.请 ...
- 2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)
2021.12.06 P2511 [HAOI2008]木棍分割(动态规划) https://www.luogu.com.cn/problem/P2511 题意: 有n根木棍, 第i根木棍的长度为 \( ...
- 2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ π )
2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ \(\pi\) ) https://www.luogu.com.cn/problem/P2508 题意: 求一个给定的圆 \( ...
- Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1747 Solved: 1015[Submit][Stat ...
- 洛谷P1450 [HAOI2008]硬币购物
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一 ...
- P1450 [HAOI2008]硬币购物
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. di,s<=100000 ...
- Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理
考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...
随机推荐
- 突发!Gitee 图床,废了!
大家好,我是鱼皮,这两天又发生了一件挺意外的事情:Gitee 的图床废了! 图床:指储存图片的服务器,便于在网上展示图片 昨天晚上,星球里不止一位小伙伴发帖子表示自己网站.文章中的图片竟然全部变成了 ...
- Python的类和继承
一.类的封装: 封装将类的信息隐藏在类内部,不允许外部直接修改该类的变量,只能通过该类提供的方法来实现对隐藏信息的操作和访问 class Boss(): # 类的公共属性 level=1 # 类的初始 ...
- IO笔记(学习尚硅谷java基础教程)
一.基础知识 1. 在普通方法和测试方法中文件路径的差异 在普通方法中:文件路径相当于在当前项目中,而不是当前Module(以项目为基准) 在测试方法中:文件路径相当于在当前Module中,而不是当前 ...
- mysql主从异步复制过程
mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失.为了保证mysql数据库的可靠性.就要会一些提高可靠性的技术. 主从复制原理如下. slave(从服务器) master(主服务器) ...
- Spring Boot 的配置文件有哪几种格式?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同. 1).properties app.user.name = javastack 2).yml app: ...
- java-jsp-learnning
简介:JSP(全称Java Server Pages) 一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结束. JSP是一种Java ser ...
- Arthas之实例操作
Arthas之实例操作 1. 静态类属性操作 获取public静态属性 ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@pu ...
- 1、Jetson Nano 远程桌面XP问题
jeston nano上网 方法3(最简单的方法) 最简单的方法真的特简单,用USB数据线连接主板的USB接口以及手机,打开手机的USB共享即可,若要使用静态IP,可在主板上修改配置文件,接口一般为u ...
- 针对于iosAPP内嵌H5,-webit-overflow-scrolling:touch;产生空白情况
问题描述:一个内嵌IOSAPP的H5页面,长页面,大概1.6个屏幕高度,由于有列表滑动起来很不流畅,所以用了-webit-overflow-scrolling:touch;这个只针对ios端的物理滚动 ...
- 微信小程序wx.login()获取openid,附:前端+后端代码
微信小程序开放了微信登录的api,无论是个人还是企业申请的小程序均可使用. 首先创建一个项目,把这些代码都清空,我们自己写! 然后,开始写了!首先index.wxml,写一个button用于发起登录 ...