【HAOI 2008】 硬币购物
【题目链接】
【算法】
此题是一道好题!
首先,我们发现 : 付款方法数 = 不受限制的方法数 - 受限制的方法数
那么,我们怎么求呢?
我们用dp求出不受限制的方法数(f[i]表示买i元的东西,不受硬币限制,有多少种方案),只需用01背包的
方法就可以了,实现非常简单
那么受限制的方法数怎么求呢?由容斥原理可知,受限制的方法数 = 第一种硬币超限 + 第二种硬币超限 + ...
- 第一,二,三,四种硬币超限
第一种硬币超限,其实就是先选(d1 + 1)枚第一种硬币,其他随便选,那么对应的数量就是
f[s - (d1 + 1) * c[1]],其他情况类似,注意当减下来小于零时是不可以的
于是,这道题便迎刃而解了!
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXS 100010 long long i,j,d1,d2,d3,d4,T,s;
long long c[];
long long ans;
long long f[MAXS]; int main()
{ scanf("%lld%lld%lld%lld%lld",&c[],&c[],&c[],&c[],&T);
f[] = ;
for (i = ; i <= ; i++)
{
for (j = c[i]; j < MAXS; j++)
{
f[j] += f[j-c[i]];
}
}
while (T--)
{
scanf("%lld%lld%lld%lld%lld",&d1,&d2,&d3,&d4,&s);
ans = f[s];
if (s - (d1 + ) * c[] >= ) ans -= f[s - (d1 + ) * c[]];
if (s - (d2 + ) * c[] >= ) ans -= f[s - (d2 + ) * c[]];
if (s - (d3 + ) * c[] >= ) ans -= f[s - (d3 + ) * c[]];
if (s - (d4 + ) * c[] >= ) ans -= f[s - (d4 + ) * c[]];
if (s - (d1 + ) * c[] - (d2 + ) * c[] >= ) ans += f[s - (d1 + ) * c[] - (d2 + ) * c[]];
if (s - (d1 + ) * c[] - (d3 + ) * c[] >= ) ans += f[s - (d1 + ) * c[] - (d3 + ) * c[]];
if (s - (d1 + ) * c[] - (d4 + ) * c[] >= ) ans += f[s - (d1 + ) * c[] - (d4 + ) * c[]];
if (s - (d2 + ) * c[] - (d3 + ) * c[] >= ) ans += f[s - (d2 + ) * c[] - (d3 + ) * c[]];
if (s - (d2 + ) * c[] - (d4 + ) * c[] >= ) ans += f[s - (d2 + ) * c[] - (d4 + ) * c[]];
if (s - (d3 + ) * c[] - (d4 + ) * c[] >= ) ans += f[s - (d3 + ) * c[] - (d4 + ) * c[]];
if (s - (d1 + ) * c[] - (d2 + ) * c[] - (d3 + ) * c[] >= ) ans -= f[s - (d1 + ) * c[] - (d2 + ) * c[] - (d3 + ) * c[]];
if (s - (d1 + ) * c[] - (d2 + ) * c[] - (d4 + ) * c[] >= ) ans -= f[s - (d1 + ) * c[] - (d2 + ) * c[] - (d4 + ) * c[]];
if (s - (d1 + ) * c[] - (d3 + ) * c[] - (d4 + ) * c[] >= ) ans -= f[s - (d1 + ) * c[] - (d3 + ) * c[] - (d4 + ) * c[]];
if (s - (d2 + ) * c[] - (d3 + ) * c[] - (d4 + ) * c[] >= ) ans -= f[s - (d2 + ) * c[] - (d3 + ) * c[] - (d4 + ) * c[]];
if (s - (d1 + ) * c[] - (d2 + ) * c[] - (d3 + ) * c[] - (d4 + ) * c[] >= ) ans += f[s - (d1 + ) * c[] - (d2 + ) * c[] - (d3 + ) * c[] - (d4 + ) * c[]];
printf("%lld\n",ans);
} return ;
}
【HAOI 2008】 硬币购物的更多相关文章
- [HAOI 2008]硬币购物
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一 ...
- 【BZOJ-1042】硬币购物 容斥原理 + 完全背包
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1811 Solved: 1057[Submit][Stat ...
- bzoj1042: [HAOI2008]硬币购物
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- 【BZOJ】【1042】【HAOI2008】硬币购物
DP+容斥原理 sigh……就差一点…… 四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$A\bigcap B\bigc ...
- 1042: [HAOI2008]硬币购物 - BZOJ
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法.Input 第一行 ...
- 【BZOJ1042】【DP + 容斥】[HAOI2008]硬币购物
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一 ...
- Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1747 Solved: 1015[Submit][Stat ...
- bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理
题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1706 Solved: 985[Submit][ ...
- BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )
先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...
- BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]
1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...
随机推荐
- 【思维】2017多校训练七 HDU6121 Build a tree
http://acm.hdu.edu.cn/showproblem.php?pid=6121 [题意] 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少 [思路] 一棵完全K叉树,对于树的每一 ...
- Lucene的例子
lucene爬数据库中的数据无非也是查询数据.所有我们用lucene搜索数据主要有下面几个步骤:(代码紧供参考) 一 , 从数据库中查数据 ====爬数据 ------------- ...
- Codevs 1497 取余运算== 洛谷P 1226
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k ...
- 「CodePlus 2018 3 月赛」白金元首与克劳德斯
所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重 ...
- 通过分析system_call中断处理过程来深入理解系统调用
通过分析system_call中断处理过程来深入理解系统调用 前言说明 本篇为网易云课堂Linux内核分析课程的第五周作业,上一次作业中我以2个系统调用(getpid, open)作为分析实例来分析系 ...
- Sigar 编译笔记
https://blog.csdn.net/zw3413/article/details/79482438
- MySQL基础架构
前段时间订阅了<Mysql实战45讲>(从原理到实战),新的一年为自己充充电.对于这部分内容,我所知道的只来源于我大学里学习的课程<数据库原理>,在大学里学习的只是简单的查询, ...
- 某考试 T2 yja
2.1 Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r1, r2, ..., rn. 最大化这 n 个点构成的凸包面积, 凸包上的点的顺序任意. 2.2 Inp ...
- dtrace
http://blog.csdn.net/lw1a2/article/details/7389323
- HDU 4279 Number(找规律)
Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...