洛谷P1450 [HAOI2008]硬币购物 背包+容斥
无限背包+容斥?
观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包
进行预处理,因为实际硬币数有限,考虑减掉多加的部分
如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推
加上不符第一枚和第二枚的方案,第一枚和第三枚的方案以此类推,不明
白原理可以去看一下容斥原理
较长代码(懒得优化)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
const int maxn=1e5+10;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return f*ret;
}
int c[5];
ll s;
ll dp[maxn];
int n;
ll ans;
ll d[5];
ll getn(int x){
return (d[x]+1)*c[x];
}
int main(){
// freopen("a.txt","r",stdin);
for(int i=1;i<=4;i++){
// c[i]=read();
cin>>c[i];
}
cin>>n;
// n=read();
// cout<<n;
dp[0]=1;
// cout<<dp[-10]<<endl;
for(int i=1;i<=4;i++){
for(int j=c[i];j<=maxn;j++){
dp[j]+=dp[j-c[i]];
}
}
// cout<<dp[10]<<endl;
while(n){
n--;
for(int i=1;i<=4;i++){
//d[i]=read();
cin>>d[i];
}
// s=read();
cin>>s;
ans=dp[s];
for(int i=1;i<=4;i++){
if(s>=getn(i)){
ans-=dp[s-getn(i)];
}
}
if(s>=getn(1)+getn(2)){
ans+=dp[s-getn(1)-getn(2)];
}
if(s>=getn(2)+getn(3)){
ans+=dp[s-getn(2)-getn(3)];
}
if(s>=getn(3)+getn(4)){
ans+=dp[s-getn(3)-getn(4)];
}
if(s>=getn(1)+getn(4)){
ans+=dp[s-getn(1)-getn(4)];
}
if(s>=getn(2)+getn(4)){
ans+=dp[s-getn(4)-getn(2)];
}
if(s>=getn(1)+getn(3)){
ans+=dp[s-getn(1)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(3)){
ans-=dp[s-getn(1)-getn(2)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(4)){
ans-=dp[s-getn(1)-getn(2)-getn(4)];
}
if(s>=getn(1)+getn(3)+getn(4)){
ans-=dp[s-getn(1)-getn(3)-getn(4)];
}
if(s>=getn(4)+getn(2)+getn(3)){
ans-=dp[s-getn(4)-getn(2)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(3)+getn(4)){
ans+=dp[s-getn(1)-getn(2)-getn(3)-getn(4)];
}
cout<<ans<<endl;
}
return 0;
}
完结撒花
洛谷P1450 [HAOI2008]硬币购物 背包+容斥的更多相关文章
- 洛谷—— P1450 [HAOI2008]硬币购物
P1450 [HAOI2008]硬币购物 硬币购物一共有$4$种硬币.面值分别为$c1,c2,c3,c4$.某人去商店买东西,去了$tot$次.每次带$di$枚$ci$硬币,买$si$的价值的东西.请 ...
- 洛谷P1450 [HAOI2008]硬币购物(背包问题,容斥原理)
洛谷题目传送门 我实在是太弱了,第一次正儿八经写背包DP,第一次领会如此巧妙的容斥原理的应用...... 对每次询问都做一遍多重背包,显然T飞,就不考虑了 关键就在于每次询问如何利用重复的信息 我这么 ...
- 洛谷P1450 [HAOI2008]硬币购物
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理
考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...
- 【洛谷P1450】硬币购物
题目大意:给定 4 种面值的硬币和相应的个数,求购买 S 元商品的方案数是多少. 题解: 考虑没有硬币个数的限制的话,购买 S 元商品的方案数是多少,这个问题可以采用完全背包进行预处理. 再考虑容斥, ...
- BZOJ1042:[HAOI2008]硬币购物(DP,容斥)
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一 ...
- P1450 [HAOI2008]硬币购物(完全背包+容斥)
P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...
- 2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)
2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP) https://www.luogu.com.cn/problem/P1450 题意: 共有 44 种硬币.面 ...
随机推荐
- 干货:不同场景容器内获取客户端源IP的方法
摘要:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢? k8s已经成为当今容器化的标准,人们在享受容器带来的高效与便利的同时,也遇到一些烦恼:客户端和容 ...
- jenkins iOS自动打包
1.Jenkins配置 采用命令行下载配置Jenkins,防止产生权限问题 1)先安装brew,打开命令行,输入:/usr/bin/ruby -e "$(curl -fsSL https:/ ...
- 《Redis内存数据库》Redis环境搭建
前言 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多 ...
- liunx之firewalld&SELinux
1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...
- Git进阶:常用命令和问题案例整理
一.前言 整理常用git命令和以及在实际使用的过程中碰到的问题案例,旨在git进阶,提升工作开发效率,有需要补充的小伙伴欢迎下方留言,本篇持续更新中... 二.命令 配置用户名和邮箱 git conf ...
- Python实现拆分多级目录的方式
1 环境 操作系统:Windows10 Python版本:Python3.7 2 简介 实现多级目录差分,举例说明如下: 假设现有的目录结构如下:1.2.2.1.2.2.2.3.2.4.3.4.5.6 ...
- goto 语法在 PHP 中的使用
在C++.Java及很多语言中,都存在着一个神奇的语法,就是goto.顾名思义,它的使用是直接去到某个地方.从代码的角度来说,也就是直接跳转到指定的地方.PHP中也有这个功能,我们先来看看它是如何使用 ...
- Gradle实战(01)--介绍与安装
前言 本章你将学习到 Gradle的介绍 Gradle的安装 Gradle的hello world 1 Gradle的介绍 Gradle是专注于灵活性和性能的开源构建自动化工具 Gradle构建脚本是 ...
- SSM获取SqlSessionFactory
1.实现类获取session //根据id 修改阈值 public int altThers(threshold threshold) { SqlSessionFactoryBuilder build ...
- Flutter学习二之Dart语言介绍
上次我记录了Flutter的环境搭建,这次来简单记录一下Drat语言,Flutter是 Google推出并开源的移动应用开发框架,开发语言是Dart,那么Dart语言和其他的语言在语法上有上面区别呢, ...