题目描述 Description###

硬币购物一共有4种硬币。面值分别为\(c_1\) ,\(c_2\) ,\(c_3\) ,\(c_4\) 。某人去商店买东西,去了\(tot\) 次。每次带\(d_i\) 枚\(c_i\) 硬币,买\(s_i\) 的价值的东西。请问每次有多少种付款方法。

输入描述 Input Description###

第一行 \(c_1\) ,\(c_2\) ,\(c_3\) ,\(c_4\) ,\(tot\) 下面\(tot\) 行 \(d_1\) ,\(d_2\) ,\(d_3\) ,\(d_4\) ,\(s\) ,

输出描述 Output Description###

每次的方法数

样例输入 Sample Input###

1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900

样例输出 Sample Output###

4
27

数据范围及提示 Data Size & Hint###

其中\(d_i,s<=100000,tot<=1000\)

之前的一些废话###

退役的我回归了,但这次重返只是为了明天的比赛,时间虽短,但重新拾起这一切的我找到了5个月前为了梦想奋斗的自己,当时的自己热血沸腾,充满斗志,说真的,我无比热爱这种感觉,但这毕竟只是昙花一现,转瞬即逝的。

题解###

背包问题带有这么多附属条件,还有数量限制,看起来好复杂啊。(谁叫我几个月没有碰OI,大脑生锈了呢)

但是如果不考虑数量限制,这就是一个很智障的背包问题了(md第一次打我循环顺序还打反了)

\(f_i\)表示不考虑任何限制,由四种硬币组成价值为i的方案数,转移为:$f[i]=\sum {f_{i-c_j}} (j \leq 4) $

显然这并不是最后的答案,因为这些方案里还藏着不少几类硬币超限的方案,于是我们需要用容斥原理把他们减掉

ans=\(f_s\) -(只有第一类硬币超的方案)--(只有第二类硬币超的方案)-(只有第三类硬币超的方案)-(只有第四类硬币超的方案)+(只有第一类第二类硬币超的方案)+..+

反正就是这四个集合的交加加减减

现在考虑如何算(只有第一类硬币超的方案)。当第一类硬币去到\(d_1+1\) 时那么一定就超了,剩下的空间就可以随便分配了,所以这个方案数$ =f_{s-c_1*(d_1+1)}$

其他的都类似。

代码###

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=5;
int c[maxn],d[maxn];
LL dp[100010];
int main()
{
for(int i=0;i<4;i++)c[i]=read();
dp[0]=1ll;
for(int i=0;i<4;i++)
for(int j=c[i];j<=100000;j++)dp[j]+=dp[j-c[i]];
//for(int i=0;i<=10;i++)printf("DP:%d %d\n",i,dp[i]);
//cout<<"fa"<<dp[100000]<<endl;
int T=read();
while(T--)
{
for(int i=0;i<4;i++)d[i]=read();
int s=read();
LL ans=0;
for(int i=0;i<16;i++)
{
int cnt=0;
LL tmp=0;
for(int j=0;j<4;j++)
if(i&(1<<j))cnt++,tmp+=(LL)c[j]*(LL)(d[j]+1);
if(tmp>s)continue;
if(cnt%2)ans-=dp[s-tmp];
else ans+=dp[s-tmp];
}
printf("%lld\n",ans);
}
return 0;
}

总结###

大脑不再那么锈了

[BZOJ1042]AOI2008]硬币购物的更多相关文章

  1. 【BZOJ1042】硬币购物(动态规划,容斥原理)

    [BZOJ1042]硬币购物(动态规划,容斥原理) 题面 BZOJ Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬 ...

  2. BZOJ1042 [HAOI2008]硬币购物 完全背包 容斥原理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1042 题目概括 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了t ...

  3. [bzoj1042][HAOI2008][硬币购物] (容斥原理+递推)

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

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

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

  5. bzoj1042: [HAOI2008]硬币购物

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

  6. BZOJ1042:[HAOI2008]硬币购物(DP,容斥)

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

  7. BZOJ1042 [HAOI2008]硬币购物 【完全背包 + 容斥】

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2924  Solved: 1802 [Submit][St ...

  8. BZOJ-1042:硬币购物(背包+容斥)

    题意:硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 思路:这么老的题,居然今天才做到. ...

  9. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

随机推荐

  1. How to: Use the Entity Framework Model First in XAF 如何:在 XAF 中使用EF ModelFirst

    This topic demonstrates how to use the Model First entity model and a DbContext entity container in ...

  2. VUE,基于vue-cli搭建创建vue项目

    前提:必须安装node.js,官方地址:https://nodejs.org/en/ 然后安装vue-cli 安装方式:cmd命令行安装:打开cmd命令符输入进行全局安装脚手架:npm install ...

  3. android sdk tools里找不到draw9patch.bat 如何制作.9.png 格式图片

    1.什么是.9.png格式 .9.png格式的图片可以在安卓平台指定拉伸区域,防止图片失真,一般用作背景图. 2.前提 最近项目中要用到.9.png格式图片,想着这个简单使用draw9patch.ba ...

  4. git命令行的颜色配置

    Git颜色branch,diff,interactive,status配置,git终端配置颜色,git命令行高亮 Git默认的输出是单一颜色的,感觉很不容易阅读,Git支持用多种颜色来显示其输出的信息 ...

  5. 一文解读RESTful (转)

    01 前言 回归正题,看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严 ...

  6. OpenStack与ZStack深度对比:架构、部署、计算、运维监控等

    摘要 OpenStack从2010年开源至今,已经走过9个年头,其正在进入主流企业市场,但该项目依然面临较难部署和管理的老问题.有一点是毫无疑问的,那就是OpenStack保持着高速增长的态势,超过5 ...

  7. Spring Boot修改JSP不用重启的办法

    在application.properties文件中添加一行代码解决. Spring Boot 2.0以上添加如下一行: server.servlet.jsp.init-parameters.deve ...

  8. [Go] 轻量服务器框架tcp的粘包问题 封包与拆包

    tcp传输的数据是以流的形式传输的,因此就没有办法判断到哪里结束算是自己的一个消息,这样就会出现粘包问题,多个包粘在一起了 可以使用这样一个自定义的形式来解决,一个消息分为 head+body  he ...

  9. 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法

    实验七.数据挖掘之K-means聚类算法 一.实验目的 1. 理解K-means聚类算法的基本原理 2. 学会用python实现K-means算法 二.实验工具 1. Anaconda 2. skle ...

  10. MATLAB实例:散点密度图

    MATLAB实例:散点密度图 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ MATLAB绘制用颜色表示数据密度的散点图 数据来源:MATLAB中“fit ...