有 n 种不同面值的硬币,每种硬币有无限多个。为了方便购物,他希望带尽量 少的硬币,但是要能组合出 1 到 m 之间的任意值。 //第一行为两个整数:m 和 n,他们的意义如题目描述。接下来的 n 行

这是一个关于如何使用最少数量的硬币组合成1到m任意金额的问题。给定n种不同面值的无限硬币,需要找出一种方法,使得能组合出1到m的所有值。解决方案涉及到排序硬币面值,从大到小寻找能够增加连续面值的硬币,以确保每次选择都能最大化覆盖更多的金额。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

题目:有 n 种不同面值的硬币,每种硬币有无限多个。为了方便购物,他希望带尽量 少的硬币,但是要能组合出 1 到 m 之间的任意值。第一行为两个整数:m 和 n,他们的意义如题目描述。接下来的 n 行,每行一个整数,第 i + 1 行的整数表示第 i 种硬币的面值最少需要携带的硬币数量,如果无解则输出-1。

输入:
20 4
1 2 5 10
输出:
5

分析:sum表示当前能凑到的最大面值(即1~sum的面值都凑到了),当sum超过m,就停止(m是题上要求凑1~m的面值)a[i]里存的是不同的面值将面值数组排序后,没有面值是1的必然无解,而且面值1必选。对于1~m,凑的时候先凑小的,因为小的多了可以满足大的。此外还有一个思想就是如果当前1~sum面值凑够了,那么下一步应该考虑凑sum+1的面值,具体过程是在排好序的面值数组中,从大到小找,找一个元素a[i](面值<=sum+1的)加等到sum上,这意味着1~(sum+a[i])面值凑齐了,这里找面值<=sum+1的寓意是保证能够凑齐的面值从sum+1面值开始到sum+a[i]面值是连续的。(例如某个时刻sum等于5,那么说明下一个要凑的面值是6,此时我们在面值数组中从大->小找<=6的元素(面值1,2,5,10),我们找到了5,那么由于sum等于5,说明1~5的面值已经凑齐了,此时如果再添加一个面值是5的硬币,那么我们是不是就可以凑齐1~10了,这里不仅凑齐了6,还多凑齐了7,8,9,10,但是要是取一个大于6的比如是10,那么1~5凑齐了ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值