【贪心】多个问题

本文探讨了两种算法在不同问题中的应用。首先,通过贪心和动态规划方法解决付钱最少纸币数量的问题,揭示了在某些情况下贪心并不总是最优解。接着,提出了一种使用贪心策略解决字符替换问题,以达到字典序最大的字符串。文章通过实例说明贪心在特定条件下的有效性,并提供了相应的代码实现。

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

零钱问题

题目描述

你有 1 1 1元, 2 2 2元, 5 5 5元RMB无数张,求付 n n n元最少用纸币多少张

这道题直觉告诉我们是贪心,因为可以先选择大的,再用小的补空缺,当然可以考虑用dp

解法1-线性dp

d p i dp_i dpi表示凑 n n n元最小纸币数
d p i = m i n ( d p ( i − 1 ) + 1 , d p i − 2 + 1 , d p i − 5 + 1 ) dp_i=\mathtt{min}(dp_(i-1)+1,dp_{i-2}+1,dp_{i-5}+1) dpi=min(dp(i1)+1,dpi2+1,dpi5+1)

解法2-贪心

如果每次选大面值的纸币,会不会更优呢?试一试以下情况
{ n = 6 a 1 = 1 a 2 = 3 a 3 = 4 \begin{cases}n=6\\a_1=1\\a_2=3\\a_3=4\end{cases} n=6a1=1a2=3a3=4
最优解: 3 + 3 = 6 3+3=6 3+3=6
贪心解: 4 + 1 + 1 = 6 4+1+1=6 4+1+1=6
DP解: { a 1 = 1 a 2 = 2 a 3 = 1 a 4 = 2 a 5 = 2 a 6 = 2 \begin{cases}a_1=1\\a_2=2\\a_3=1\\a_4=2\\a_5=2\\a_6=2\end{cases} a1=1a2=2a3=1a4=2a5=2a6=2

  • 很明显贪心是错误的

人不能贪心,不然会WA(一无所成)

但是你可以试一试1,2,5的情况,你会发现 W A \mathtt{WA} WA W A \mathtt{WA} WA不了

为什么呢?

考虑没有 5 5 5的情况

没有 5 5 5时: ⌊ n + 1 2 ⌋ \left\lfloor\dfrac{n+1}{2}\right\rfloor 2n+1

有一个 5 5 5时: ⌊ n − 4 2 ⌋ \left\lfloor\dfrac{n-4}{2}\right\rfloor 2n4

很明显第二个优,所以一定有 5 5 5->可推得有最多 5 5 5时最优

替换

题目描述

有给定一个字符可重集 S S S,给定字符串 s s s,求将 s s s中一些字符替换成 S S S中的字符, S S S中每个字符最多替换一次,使得最后字符串字典序最大

样例:
acbc aacab

cccbb

大致想一想,好似可以用trie+dfs之类的,但贪心可以解决

解法1-贪心

首先位数一定,所以前面尽可能大,所以对字符集从大到小排序,其次对于每一位,与指针 i i i比较,若这一位大于 i i i指向的,则不替换,否则替换

for(int j=1;j<=n and i<=S.size();j++)
	if(s[j]<S[i])
		s[j]=S[i],i++;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值