零钱问题
题目描述
你有 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(i−1)+1,dpi−2+1,dpi−5+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 ⌊2n−4⌋
很明显第二个优,所以一定有 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++;