题目描述 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. config-server-bus动态更新配置

    config-server用来搭建配置中心,而配置信息一般使用gitlab仓库来存储,这样在你的配置发生改变时,不需要从新打包,而如果使用native的试,则需要从新打一个config-server的 ...

  2. 基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题

    目录 基于Git的数据库sql文件的管理--完美解决团队sql操作协同问题 1.产生背景 2.之前没用Git管理数据库出现的问题 2.1 用同一个库调试带来的问题 3.解决方案 3.1 Sql文件的创 ...

  3. JavaScript 递归遍历json串获取相关数据

    递归遍历json串获取相关数据   by:授客 QQ:1033553122 1.   测试数据 // 导航菜单 [ { id: 1, parentId: 0, parentName: null, na ...

  4. 「SAP技术」A项目关联公司间退货STO流程

    [SAP技术]A项目关联公司间退货STO流程 1)创建公司间退货STO单据. 如下图示的公司间退货STO 4500000572, 2),VL10B, 创建交货单. 如下图交货单号:80044918, ...

  5. VUE添加网站favicon.ico图标

    1.修改webpack.dev.conf文件   webpack.prod.conf文件 new HtmlWebpackPlugin({ filename: 'index.html', templat ...

  6. PWA 学习笔记(一)

    PWA 介绍 概念: PWA(Progressive web apps,渐进式 Web 应用)运用现代 Web API 和传统的渐进式增强策略来创建跨平台 Web 应用程序 它并不是一个快捷方式,而能 ...

  7. CentOS自动化安装LAMP脚本

    #!/bin/bash #-- #blog:lizhenliang.blog.51cto.com ########## function ########## depend_pkg () { yum ...

  8. Linux系统学习 十四、VSFTP服务—配置文件解析、客户端使用

    3.配置文件解析 默认配置选项: 一般情况下不允许匿名用户登录 全局配置选项:(手工添加) listen_address=192.168.4.1             #设置监听地址 listen_ ...

  9. August 18th, 2019. Week 34th, Sunday

    Fear doesn't shut you down, it wakes you up. 恐惧不会消磨你的意志,它能激发你的潜能. We all know that fear is powerful, ...

  10. Java之Map接口(双列集合)

    Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...