【题目链接】

点击打开链接

【算法】

此题是一道好题!

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

那么,我们怎么求呢?

我们用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. hibernate保存oracle日期时间

    用java生成一个带年月日时分秒的时间,通过hibernate对象保存到oracle中的Date字段中, 第一种方法: java实体类的createDate属性,类型为java.util.Date h ...

  2. Euclidean Nim(bzoj 4147)

    Description Euclid和Pythagoras在玩取石子游戏,一开始有n颗石子. Euclid为先手,他们按如下规则轮流操作: ·若为Euclid操作,如果n<p,则他只能新放入p颗 ...

  3. POJ 2749 2SAT判定+二分

    题意:图上n个点,使每个点都与俩个中转点的其中一个相连(二选一,典型2-sat),并使任意两点最大 距离最小(最大最小,2分答案),有些点相互hata,不能选同一个中转点,有些点相互LOVE,必需选相 ...

  4. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  5. Vue基础学习

    使用vue-cli构建初始化vue项目 vue init webpack myfirst 项目截图:(开发工具:webStorm) 主要练习了vue的基本指令:v-bind.v-if.v-show.v ...

  6. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...

  7. CentOS 5.11安装配置LAMP服务器(Apache+PHP5+MySQL)

    http://www.osyunwei.com/archives/8880.html 准备篇: CentOS 5.x系统安装配置图解教程 http://www.osyunwei.com/archive ...

  8. 创立一个站点的前前后后(起因,域名,云平台,备案,CDN等等)(1)

    起因 写完<完美软件开发:方法与逻辑>这书后,原本想继续写书的,可出来參加了些社区活动后,我发现我写的书大家评价还行.但事实上不太理解.而接下来想写的书更加抽象点.准备叫<管理的解析 ...

  9. powerdesign导出SQL时自己主动生成凝视

    1.使用脚本的方式 在里面执行 Option Explicit ValidationMode   = True InteractiveMode   =   im_Batch Dim   mdl   ' ...

  10. Python遇到的零碎小问题

    切记else语句的后面直接加冒号: 字符和数字绝对不能直接相加 对于字符与整数之间的转化 ord('E')可以将其转化为45,chr(65)可以将其转化为A 编写程序的时候尽量要考虑时间复杂度 app ...