代码题:1、2、5面值的零钱无限个,凑出n有多少种方案?
看了一眼,完全背包,准备写循环了。写了几行,感觉递归好写,换递归写。写了个有bug的如下,面试官说这样肯定不行,比较紧张,不自信,用了好长时间乱想,没继续改出bug,最后写了个暴力枚举。 1
2
3
4
5
6
7
8
int f(int n,int x)
{
if(n==0)return 1;
if(n<0)return 0;
if(x==1)return f(n-1,1);
if(x==2)return f(n-1,2)+f(n-2,2);
if(x==5)return f(n-1,5)+f(n-2,5)+f(n-5,5);
}
结束后,自己一写如下,明明是对的啊(逻辑思路对,先不写记忆化搜索),才想到面试时写了bug。后序听录音,是跟面试官互动太多,被面试官绕晕了,本来这样写逻辑是正确的,结果写的过程中面试官问x是什么意思,我说是最大用到几,x是5代表可以用125,x为2代表可以用12,x为1代表可以用1,面试官说5的情况包含了1的情况,所以肯定有重复呀,我一想确实是这个理,就没相信自己的做法,之后就越走越偏,迈向凉凉了。 1
2
3
4
5
6
7
8
int f(int n,int x)
{
if(n==0)return 1;
if(n<0)return 0;
if(x==1)return f(n-1,1);
if(x==2)return f(n-1,1)+f(n-2,2);
if(x==5)return f(n-1,1)+f(n-2,2)+f(n-5,5);
}
这道题从前到后花了33min,没搞出来,最后写了个暴力,完蛋。
本文讨论了一个经典的背包问题:使用1元、2元和5元硬币组合成n元的不同方式的数量。作者尝试了多种方法,包括递归和记忆化搜索,并分享了在面试场景下解决问题的经验教训。

被折叠的 条评论
为什么被折叠?



