代码题: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,没搞出来,最后写了个暴力,完蛋。