【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\)的方案数 完全背包方案数? 询问太多了 看了题解 ...
随机推荐
- POJ 1006-Biorhythms,中国剩余定理,学信安的路过!
Biorhythms 我竟然1A了, 终于从一天的浑噩中找回点自信了.人生第一次做中国剩余定理的题 ...
- poj 1579 简单dp由下往上
#include<stdio.h> #include<string.h> #define N 22 int dp[N][N][N]; int main() { int n,m, ...
- bzoj3142[Hnoi2013]数列 组合
Description 小 T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察 到:除第一天外每天的股价都 ...
- 转 Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
转自: http://www.cnblogs.com/huangcong/archive/2011/08/29/2158268.html 黄聪:Python 字符串操作(string替换.删除.截取. ...
- Xcode 全局搜索失效的问题
早上手一快不知点了什么,然后全局搜索的功能就不起作用了.百度了一下才知道,原来把搜索范围给改了,改回来如下:
- HDU 4609 FFT+组合数学
3-idiots Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Spoj 3267 DQUERY - D-query
题目描述 English VietnameseGiven a sequence of n numbers a _{1}1 , a _{2}2 , ..., a _{n}n and a numbe ...
- css三大布局
标准流: 从左到右,从上到下块级元素独占一行,行内元素碰到父盒子边缘换行 浮动: 特点 1 元素浮动之后不占据原来的位置(脱标),变成立体,下面可以有东西,只影响下面的 2 浮动的盒子在一行上显示 3 ...
- Dialog集合
点击查看原文 demo下载地址http://download.csdn.net/detail/metis100/8498401 安卓开发一年.開始想整理些资料成库,以备日后高速开发. 第一天,整理了经 ...
- 2>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _calloc 已经在 LIBCMTD.lib(dbgcalloc.obj) 中定义
使用VS2010,在FireBreath里面调用ortp库和Speex库.编译的时候出现错误: 2>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _ca ...