洛谷P1450.硬币购物
题目大意:4种面值c[i]的硬币,每种硬币持有d[i]个,问有多少种方法支付出正好N块钱。
可以先预处理出持有硬币无限的情况dp[n],即一个完全背包问题。
之后根据容斥原理,相当于求但是拥有限制
,可以参考有限制的不定方程非负整数解的容斥方法,我们设全集
为所有在无限情况下凑出S的方案数,属性为
,那么就可以对所有补集的并用容斥原理展开进行计算,对于每个
是由具有k个不同反向性质
组成的集合,对应在容斥式子中的答案就是在无限情况下凑出
的方案数即
。
最后用全集减去就可以了。
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
//#define int LL
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const int maxn = 100010;
const int mod = 1e9 + 7;
const double eps = 1e-8;
LL c[5], N;
LL d[5], S;
LL dp[maxn];
void solve()
{
memset(dp, 0, sizeof(dp));
dp[0] = 1;//价格为0时无限硬币组成之方法数
for (LL i = 1; i <= 4; i++)
{
for (LL j = 0; j <= S; j++)
{
if (j - c[i] >= 0)
dp[j] += dp[j - c[i]];
}
}
LL ans = 0;
for (LL i = 1; i < 16; i++)//枚举集合数1的个数
{
LL tmp = S, bit = 0;//1的个数
for (LL j = 1; j <= 4; j++)
{
if ((i >> (j - 1)) & 1)//这一位1
{
tmp -= c[j] * (d[j] + 1);
bit++;
}
}
if (tmp >= 0)
ans += (bit % 2 ? 1 : -1) * dp[tmp];//用容斥转化为无限制的完全背包情形
}
cout << dp[S] - ans << endl;
}
int main()
{
IOS;
for (int i = 1; i <= 4; i++)
cin >> c[i];
cin >> N;
for (int i = 0; i < N; i++)
{
for (int j = 1; j <= 4; j++)
cin >> d[j];
cin >> S;
solve();
}
return 0;
}
洛谷P1450.硬币购物的更多相关文章
- 洛谷 P1450.硬币购物 解题报告
P1450.硬币购物 题目描述 硬币购物一共有\(4\)种硬币.面值分别为\(c1,c2,c3,c4\).某人去商店买东西,去了\(tot\)次.每次带\(d_i\)枚\(c_i\)硬币,买\(s_i ...
- 洛谷 P1450 解题报告
P1450.硬币购物 题目描述 硬币购物一共有\(4\)种硬币.面值分别为\(c1,c2,c3,c4\).某人去商店买东西,去了\(tot\)次.每次带\(d_i\)枚\(c_i\)硬币,买\(s_i ...
- 洛谷P1450 [HAOI2008]硬币购物(背包问题,容斥原理)
洛谷题目传送门 我实在是太弱了,第一次正儿八经写背包DP,第一次领会如此巧妙的容斥原理的应用...... 对每次询问都做一遍多重背包,显然T飞,就不考虑了 关键就在于每次询问如何利用重复的信息 我这么 ...
- 洛谷—— P1450 [HAOI2008]硬币购物
P1450 [HAOI2008]硬币购物 硬币购物一共有$4$种硬币.面值分别为$c1,c2,c3,c4$.某人去商店买东西,去了$tot$次.每次带$di$枚$ci$硬币,买$si$的价值的东西.请 ...
- 洛谷P1450 [HAOI2008]硬币购物
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一 ...
- 【洛谷P1450】硬币购物
题目大意:给定 4 种面值的硬币和相应的个数,求购买 S 元商品的方案数是多少. 题解: 考虑没有硬币个数的限制的话,购买 S 元商品的方案数是多少,这个问题可以采用完全背包进行预处理. 再考虑容斥, ...
- 洛谷P1450 [HAOI2008]硬币购物 背包+容斥
无限背包+容斥? 观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包 进行预处理,因为实际硬币数有限,考虑减掉多加的部分 如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推 ...
- 洛谷P2732 商店购物 Shopping Offers
P2732 商店购物 Shopping Offers 23通过 41提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交 讨论 题解 最新讨论 暂时没有讨论 题目背景 在商店中, ...
- 洛谷——P2708 硬币翻转
P2708 硬币翻转 题目背景 难度系数:☆☆☆☆☆(如果你看懂了) 题目描述 从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的.正面朝上的用1表示,背面朝上的用0表示.现在要求从这行的第一个硬 ...
随机推荐
- static关键字的一些使用
百度百科定义static关键字 通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例.在成员的声明前面加上关键字static(静态的)就能创建 ...
- Stream流的基本介绍以及在工作中的常用操作(去重、排序以及数学运算等)
平时工作中,我在处理集合的时候,总是会用到各种流操作,但是往往在处理一些较为复杂的集合时,还是会出现无法灵活运用api的场景,这篇文章的目的,主要是为介绍一些工作中使用流时的常用操作,例如去重.排序和 ...
- JavaScript之ES6常用新特性
参考:https://www.jianshu.com/p/ac1787f6c50f 变量声明:const 与 let const:常量,必须初始化值 let:变量 格式:const 变量A = & ...
- ajaxl利用json 传送数据的 三种提交方式?
一.在servlet类中添加几个javabean对象,放置数据. package com.aaa.servlet; import java.io.IOException; import java.ut ...
- WebAssembly编译
环境:centos 7.9 1.准备环境 sudo yum install docker sudo systemctl start docker.service sudo docker pull tr ...
- Markdown学习——Typora入门之常用操作语法及其快捷键
Markdown 学习--Typora入门 Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档. 由于Markdown的轻 ...
- Flutter Windows 桌面端支持进入稳定版
Flutter 创建伊始,我们就致力于打造一个能够构建精美的.可高度定制的.并且可以编译为机器码的跨平台应用解决方案,以充分发挥设备底层硬件的全部图形渲染能力.今天,Flutter 对 Windows ...
- Android动态加载布局之LayoutInflater【转】
万分感谢大佬:https://www.jianshu.com/p/6a235ba5ee17 深入了解View<一>之Android LayoutInfalter原理分析 下文为:Layou ...
- mybatis的一对多(collection)
使用图解: 低效率查询: 高效率查询: 1 查询用联合查询 2<collection 里面不写column
- js金额转中文大写
基础参数: var AIW_number = {0:'零', 1:'壹', 2:'贰', 3:'叁', 4:'肆', 5:'伍', 6:'陆', 7:'柒', 8:'捌', 9:'玖'} var AI ...