洛谷 P1450 [HAOI2008] 硬币购物

2023-12-03 14:28

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

思路

完全背包:预处理出不限制硬币数量的方案数。

dp[0]=1;
dfor(i,1,4) dfor(j,c[i],(int)1e5) dp[j]+=dp[j-c[i]];

容斥

  • 不限制数量的方案数 − - 超出限制的方案数 = 符合限制的方案数 。考虑第 i i i 种硬币超出数量限制的方案数。强制支付 d i + 1 d_i+1 di+1 i i i 种硬币,价值为 c i ∗ ( d i + 1 ) c_i*(d_i+1) ci(di+1) ,此时再支付硬币 i i i 一定是超出限制的。得:超出硬币 i i i 限制的价值为 s − c i ∗ ( d i + 1 ) s-c_i*(d_i+1) sci(di+1) ,方案数为 d p [ s − c i ∗ ( d i + 1 ) ] dp[s-c_i*(d_i+1)] dp[sci(di+1)]
  • 上述得出超出硬币 i i i 价值为 s − c i ∗ ( d i + 1 ) s-c_i*(d_i+1) sci(di+1) ,这只是一种硬币的情况,如果不止一种硬币,你无法保证价值 s − c i ∗ ( d i + 1 ) s-c_i*(d_i+1) sci(di+1) 中是否包含了硬币 j j j 的符合限制的价值,也就是说 d p [ s − c i ∗ ( d i + 1 ) ] dp[s-c_i*(d_i+1)] dp[sci(di+1)] 中有硬币 j j j 符合限制的方案数。
  • 硬币 i i i 超出限制集合表示为 A i A_i Ai ,硬币 j j j 超出限制集合表示为 A j A_j Aj A i ∪ A j = A i + A j − A i ∩ A j A_i\cup A_j=A_i+A_j-A_i\cap A_j AiAj=Ai+AjAiAj不多说奇加偶减 。不限制集合设为 S S S,答案集合 a n s = S − ( A i ∪ A j ∪ … ) ans=S-(A_i\cup A_j\cup \ldots) ans=S(AiAj)

二进制

  • 用每一位表示一种硬币, 1 1 1 那一位存在硬币, 0 0 0 反之。如 0101 0101 0101 表示第 3 3 3 种硬币和第 1 1 1 种的并集。
dfor(i,1,15)
{re int cnt=0,sum=0;dfor(j,0,3)if(i&(1<<j)) ++cnt,sum+=c[j+1]*(d[j+1]+1);int f=cnt&1?-1:1;if(s>=sum) ans+=f*dp[s-sum];
}

Think Twice, Code Once

#include<bits/stdc++.h>
#define il inline
#define get getchar
#define put putchar
#define is isdigit
#define re register
#define int long long
#define dfor(i,a,b) for(re int i=a;i<=b;++i)
#define dforr(i,a,b) for(re int i=a;i>=b;--i)
#define dforn(i,a,b) for(re int i=a;i<=b;++i,put(10))
#define mem(a,b) memset(a,b,sizeof a)
#define memc(a,b) memcpy(a,b,sizeof a)
#define pr 114514191981
#define gg(a) cout<<a,put(32)
#define INF 0x7fffffff
#define tt(x) cout<<x<<'\n'
#define ls i<<1
#define rs i<<1|1
#define la(r) tr[r].ch[0]
#define ra(r) tr[r].ch[1]
#define lowbit(x) (x&-x)
using namespace std;
typedef unsigned int ull;
int read(void)
{re int x=0,f=1;re char c=get();while(!is(c)) (f=c==45?-1:1),c=get();while(is(c)) x=(x<<1)+(x<<3)+(c^48),c=get();return x*f;
}
void write(int x)
{if(x<0) x=-x,put(45);if(x>9) write(x/10);put((x%10)^48);
}
#define writeln(a) write(a),put(10)
#define writesp(a) write(a),put(32)
#define writessp(a) put(32),write(a)
const int N=1e5+10,M=3e4+10,SN=1e4+10,mod=998244353;
int n,s,c[5],d[5],dp[N];
signed main()
{dfor(i,1,4) c[i]=read();n=read();dp[0]=1;dfor(i,1,4) dfor(j,c[i],(int)1e5) dp[j]+=dp[j-c[i]];while(n--){dfor(i,1,4) d[i]=read();s=read();re int ans=dp[s];dfor(i,1,15){re int cnt=0,sum=0;dfor(j,0,3)if(i&(1<<j)) ++cnt,sum+=c[j+1]*(d[j+1]+1);int f=cnt&1?-1:1;if(s>=sum) ans+=f*dp[s-sum];}writeln(ans);}return 0;
}

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



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

相关文章

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达人合作,共同创造出既符合品牌调性又能吸引全球用户的独特营销内容。 一、短视频:将创意融入每一帧