洛谷P1450 硬币购物

2023-12-10 22:28
文章标签 购物 洛谷 硬币 p1450

本文主要是介绍洛谷P1450 硬币购物,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门:

P1450 [HAOI2008] 硬币购物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1450

题干:

题目描述

共有 4 种硬币。面值分别为 c1​,c2​,c3​,c4​。

某人去商店买东西,去了 n 次,对于每次购买,他带了 di​ 枚 种硬币,想购买 s 的价值的东西。请问每次有多少种付款方法。

输入格式

输入的第一行是五个整数,分别代表c1​,c2​,c3​,c4​,n。

接下来 n 行,每行有五个整数,描述一次购买,分别代表 d1​,d2​,d3​,d4​,s。

输出格式

对于每次购买,输出一行一个整数代表答案。

输入输出样例

输入 #1复制

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

输出 #1复制

4
27

说明/提示

数据规模与约定
  • 对于 100% 的数据,保证 1≤ci​,di​,s≤10^5,1≤n≤1000。

这道题与前面那一道小球盒子的是一模一样。

我们大的方向还是从补集的角度。

它给了我们四种硬币,每个硬币给了限制,那么我所有的合法的答案,必然是花费的硬币少于限制的答案。由于它多了一个需要花s钱的条件,所以这题要用到递推dp。

首先算全集,也就是没有任何限制,我们只需要花钱买s钱的物品即可。

那么总共的方案数 就是 f (s)

假如第一种硬币超过限制,我们不管超过多少,只需要让第一种硬币 先花费d1+1 个,

然后 剩下的钱:s - c1*(d1+1) .

如果剩下的钱大于0,就让四种硬币随便组合凑出 s - c1*(d1+1)元,返回其答案即可

如果剩下的钱小于0,就直接是 0种可能

指定一种硬币超限其他不管,一共有4种可能,

然后下一种就是指定两种硬币超限,其他不管。

指定3种硬币超限……

指定4种硬币超限……

我们只需要求出这四种情况的并集即可。

由容斥定理可以知道  四种情况的并集为:奇数-偶数

也就是奇数种硬币超限-偶数种硬币超限

最后用 全集减去并集,就是得到的答案。

(全集减去并集,符号改变,也就是变成偶数-奇数)

那么在此之前我们必须要用完全背包处理预处理一下无限硬币的情况就好了。

上答案:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cctype>
#include<map>
#include<set>
#include<queue>
#include<numeric>
#include<iomanip>
using namespace std;
const int MAXN =1e5 ;
typedef long long ll;
long long dp[MAXN+5];long long get(long long x) {if (x < 0)return 0;return dp[x];
}
int main() {ll c[10];dp[0] = 1;for (ll i = 1; i <= 4; i++) {cin >> c[i];for (ll j = c[i]; j <= MAXN; j++) {dp[j] += dp[j - c[i]];}}ll q;cin >> q;while (q--) {ll d[10],s;for (ll i = 1; i <= 4; i++) {cin >> d[i];d[i] = (d[i] + 1) * c[i];}cin >> s;cout<< get(s) - get(s - d[1]) - get(s - d[2]) - get(s - d[3]) - get(s - d[4]) + get(s - d[1] - d[2]) + get(s - d[1] - d[3]) + get(s - d[1] - d[4]) + get(s-d[3] - d[2]) + get(s - d[4] - d[2]) + get(s - d[3] - d[4]) - get(s - d[1] - d[2] - d[3]) - get(s - d[1] - d[2] - d[4]) - get(s - d[4] - d[2] - d[3]) - get(s - d[1] - d[3] - d[4]) +  get(s - d[1] - d[2] - d[3] - d[4]) ;cout <<endl;}
}

这篇关于洛谷P1450 硬币购物的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478573

相关文章

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

时尚购物新趋势:Spring Boot技术在时装系统中的应用

第3章 系统分析 3.1 需求分析 时装购物系统主要是为了提高工作人员的工作效率和更方便快捷的满足用户,更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性,遵循开发的系统优化的原则,经过全面的调查和研究。 系统所要实现的功能分析,对于现在网络方便的管理,系统要实现用户可以直接在平台上进行查看所有数据信息,根据需求可以进行在线添加

网页时装购物系统:Spring Boot框架的创新设计

第1章 绪论 1.1背景及意义 随着社会的快速发展,计算机的影响是全面且深入的。人们生活水平的不断提高,日常生活中人们对时装购物系统方面的要求也在不断提高,喜欢购物的人数更是不断增加,使得时装购物系统的开发成为必需而且紧迫的事情。时装购物系统主要是借助计算机,通过对时装购物系统所需的信息管理,增加用户的选择,同时也方便对广大时装购物系统的及时查询、修改以及对时装购物系统的及时了解。时装购物系统对用

时尚购物革命:Spring Boot技术在网页时装系统中的应用

第1章 绪论 1.1背景及意义 随着社会的快速发展,计算机的影响是全面且深入的。人们生活水平的不断提高,日常生活中人们对时装购物系统方面的要求也在不断提高,喜欢购物的人数更是不断增加,使得时装购物系统的开发成为必需而且紧迫的事情。时装购物系统主要是借助计算机,通过对时装购物系统所需的信息管理,增加用户的选择,同时也方便对广大时装购物系统的及时查询、修改以及对时装购物系统的及时了解。时装购物系统对用

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

重塑购物体验:TikTok达人与服装品牌的创意营销方式

数字化时代,TikTok独特的算法和内容传播机制为品牌提供了前所未有的营销机会。特别是在服装行业,TikTok达人与品牌的合作正在不断创新,推动着新的营销形式的出现。这些形式不仅能够展现品牌的创意和多样性,还能够在全球范围内吸引用户的关注和参与。本文Nox聚星将和大家探讨服装品牌如何与TikTok达人合作,共同创造出既符合品牌调性又能吸引全球用户的独特营销内容。 一、短视频:将创意融入每一帧