【题目链接】

点击打开链接

【算法】

此题是一道好题!

首先,我们发现 : 付款方法数 = 不受限制的方法数 - 受限制的方法数

那么,我们怎么求呢?

我们用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】 硬币购物的更多相关文章

  1. [HAOI 2008]硬币购物

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

  2. 【BZOJ-1042】硬币购物 容斥原理 + 完全背包

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

  3. bzoj1042: [HAOI2008]硬币购物

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  4. 【BZOJ】【1042】【HAOI2008】硬币购物

    DP+容斥原理 sigh……就差一点…… 四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$A\bigcap B\bigc ...

  5. 1042: [HAOI2008]硬币购物 - BZOJ

    Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法.Input 第一行 ...

  6. 【BZOJ1042】【DP + 容斥】[HAOI2008]硬币购物

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

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

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

  8. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

    题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1706  Solved: 985[Submit][ ...

  9. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  10. BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]

    1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...

随机推荐

  1. POJ1703-Find them, Catch them 并查集构造

                                             Find them, Catch them 好久没有做并查集的题,竟然快把并查集忘完了. 题意:大致是有两个监狱,n个 ...

  2. [luoguP2073] 送花(set)

    传送门 set #include <set> #include <cstdio> #include <iostream> #define LL long long ...

  3. hdu 1232水

    #include<stdio.h> #define N 1000 int pre[N]; int find(int n ){ return pre[n]=n==pre[n]?n:find( ...

  4. sequence(bzoj 1367)

    Description Input Output 一个整数R Sample Input 794820141518 Sample Output 13 HINT 所求的Z序列为6,7,8,13,14,15 ...

  5. Java开发一些小的思想与功能小记(二)

    1.用if+return代替复杂的if...else(if+return) public static void test1(String str) { if ("1".equal ...

  6. 某考试 T2 yja

    2.1 Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r1, r2, ..., rn. 最大化这 n 个点构成的凸包面积, 凸包上的点的顺序任意. 2.2 Inp ...

  7. Spring中使用byType实现Beans自动装配

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byType.html: 此 ...

  8. [转]用AOP改善javascript代码

    有时候,不光要低头写代码,也要学着站在更高的角度,来思考代码怎么写,下面这篇文章,讲的关于代码设计的问题,脑洞大开. 原文: http://www.alloyteam.com/2013/08/yong ...

  9. curl 发送json请求

    curl 发送json请求 这个是在cmd环境下的输入:注意{\"userName\":\"helo\",\"id\":1}中间不能有空格 ...

  10. win8系统 如何默认显示文件扩展名和显示隐藏文件

    装一个魔方软件,然后再任意文件或者文件夹上面右击,依次点击下面两项,就可以默认显示文件扩展名和显示隐藏文件