bzoj 1042 HAOI2008 硬币购物
这道题思路是在是神。
先dp出没有限制时候的方案数。
dp的时候注意 先循环 1..4 再循环 1..maxs 防止重复。边界是f[0] = 1。 这么基础的背包都忘记了=_=
接下来处理有重复的问题,容斥原理
容斥原理说起来很简单,但有一些很神奇的应用,比如这道题。
最终的答案 = 没有限制的方案 - 其中一种超了限制的方案 + 其中两种超了限制的方案 - 三种超了限制的方案 + 四种超了限制的方案
ans = f[s] + f[s - c[i]*(d[i]+1)] - …… + f[s - c[1]*(d[1]+1)……]
为什么是 d[i]+1 呢?
至少用d[i]+1个,剩下的随意,又是不限制的方案数了。
上代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100010
using namespace std; int c[], n, d[], s;
long long f[N] = {}; void make_f()
{
f[] = ;
for (int j = ; j <= ; ++j)
for (int i = c[j]; i <= N-; ++i)
f[i] += f[i-c[j]];
} long long getans()
{
long long ans = f[s];
for (int i = ; i <= ; ++i)
if (s - c[i]*(d[i]+) >= )
ans -= f[s - c[i]*(d[i]+)];
for (int i = ; i <= ; ++i)
for (int j = i+; j <= ; ++j)
if (s - c[i]*(d[i]+) - c[j]*(d[j]+) >= )
ans += f[s - c[i]*(d[i]+) - c[j]*(d[j]+)];
for (int i = ; i <= ; ++i)
for (int j = i+; j <= ; ++j)
for (int k = j+; k <= ; ++k)
if (s - c[i]*(d[i]+) - c[j]*(d[j]+) - c[k]*(d[k]+) >= )
ans -= f[s - c[i]*(d[i]+) - c[j]*(d[j]+) - c[k]*(d[k]+)];
if (s - c[]*(d[]+) - c[]*(d[]+) - c[]*(d[]+) - c[]*(d[]+) >= )
ans += f[s - c[]*(d[]+) - c[]*(d[]+) - c[]*(d[]+) - c[]*(d[]+)];
return ans; } int main()
{
for (int i = ; i <= ; ++i) scanf("%d", &c[i]);
make_f(); scanf("%d", &n);
while (n--)
{
for (int i = ; i <= ; ++i) scanf("%d", &d[i]);
scanf("%d", &s);
printf("%I64d\n", getans());
}
return ;
}
bzoj 1042 HAOI2008 硬币购物的更多相关文章
- 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\)的方案数 完全背包方案数? 询问太多了 看了题解 ...
- BZOJ 1042: [HAOI2008]硬币购物 容斥+背包
1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...
- BZOJ 1042: [HAOI2008]硬币购物 (详解)(背包&容斥原理)
题面:https://www.cnblogs.com/fu3638/p/6759919.html 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚 ...
- BZOJ 1042: [HAOI2008]硬币购物 容斥原理_背包_好题
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值的东西.请问每次有多少种付款方法. 题解: 十分喜 ...
- ●BZOJ 1042 [HAOI2008]硬币购物
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1042 题解: 容斥原理,dp预处理首先跑个无限物品的背包dp求出dp[i]表示在四种物品都有 ...
随机推荐
- 如何恢复 Linux 上删除的文件,第 1 部分
来源:http://www.ibm.com/developerworks/cn/linux/l-cn-filesrc/ 原理及普通文件的恢复 要想恢复误删除的文件,必须清楚数据在磁盘上究竟是如何存储的 ...
- Maven项目报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
刚刚新建完Maven项目,一般都会报这个错误,原因是没有默认添加需要的javax.servelet的jar包,所以打开pom.xml文件添加如下dependency即可: <dependency ...
- kafka 简介
1. 概述 Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据,使用scala编写.活跃的流式数据在web网站应用中非常常见,这些数据包括网站的pv.用户访 ...
- framework&&library's root
框架和文件集合的路径应该是相对路径而不是绝对路径 写法如下图所示:
- 沈逸老师PHP魔鬼特训笔记(9)--进化
回到第一课,我们学过PHP母体,了解过解析PHP程序.PHP其实内置了一个web服务器,专门给我们开发测试使用,那么接下来我们要完成的是:生成后创建一个web 服务,在浏览器中可以访问. PHP的母体 ...
- Pull解析-解析xml文件
首先需要导入jar包:kxml2-2.2.2.jar 例程: main: /** * pull解析 * * @author my * */ public class DemoParserStudent ...
- open source e-business software - prestashop
https://www.prestashop.com/en/system-requirements
- c#几个小例子引发的思考
楚广明老师的c#教程每一节都会给出几个小例子让大家联系,对于初学者来说这确实是一件很纠结的事情,下面我把这几个小例子简单的写一下.同时看一下我们学到了什么 1.面向过程版的圆周长面积计算 using ...
- hdu-5683 zxa and xor (位运算)
题目链接: zxa and xor Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- Pascal 语言中字符与字符串
[题目]输入一段文章(255个字符以内),求文章中单词的个数,相同单词只记一次,The 和 the 视作相同. [敲代码] //网友代码 var article,w:string; arr:array ...