洛谷 P5020 [NOIP2018 提高组] 货币系统

这篇博客介绍了洛谷P5020 NOIP2018提高组的货币系统问题,探讨了如何找到与给定货币系统等价且面值种类最少的新系统。通过完全背包的变形和贪心策略,博主阐述了选择最小面值以避免引入无效货币的思想,并强调在循环中及时更新答案的重要性。
摘要由CSDN通过智能技术生成

P5020 [NOIP2018 提高组] 货币系统

题目大意:有T组数据,每组数据给你一个货币系统,其中含有n种面值的货币,分别为 a[1…n] 。
现在要输出一种与给定系统等价的所含货币面值种数最小的系统。(两个系统等价就是其能表示出的钱数完全相同,即对于某个面值x,如果能被一个系统所表示,就一定能为另一个系统所表示,反之亦然),输出T行,每行一个系统的最小面值种数m。

算法思路:完全背包变形,贪心。

想法:
1、最终的系统中的所有面值一定是原有系统中的面值,如果引进新面值可能会导致有些原本不能表示出的钱数反而被表示出,我们所要做的就是去除多余的无效面值。
(其实在实际生活中并不是一个好的选择)
来自于洛谷大神“0x3喵酱”的证明

2、首先可以进行从小到大的排序,然后这里有一个贪心思想,即就是优先选择<不能被比他更小的面值所表示出的>当前最小面值,然后将完全背包扫一遍,标记所有当前的面值种类所能表示出的钱数。

3、f数组代表着所有当前的面值种类所能表示出的钱数,所以之前的结果需要保留。

4、一定要在循环中选择最小合法面值时就把总数ans++,不然会出现一堆奇奇怪怪的错误。

#include<bits/stdc++.h>

using namespace std;

int T,n,ans,a[110
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值