多个数字组合相加的和最接近或等于某个数的算法

2010 年中兴面试题
输入两个整数n 和m從数列1,23.......n 中随意取几个数,
使其和等于m ,要求将其中所有的可能组合列出来。

1、比起微软google,百度这些公司中兴的面试题还是略显逗比的,并非是说难度上差异而是中兴的题目总是显得不伦不类。本题其实就是考察数的组合对于此类问题,通常手段都是递归而我们的目标就在于找出递归式。

2、问题其实本质上就是0/1背包问题对于每一个n,我们采用贪婪策略先考察是否取n,如果取n那么子问题就变成叻find(n-1,m-n),而如果舍弃n子问题则为find(n-1,m)。至此我们利用DP思想找到了递归式(很多时候,所谓动态规划贪婪只是一念之差)。

3、那么如何制定解的判定策略?我们知道递归需要边界条件,而针对背包问题边界条件只有两种,如果n<1或者m<1那么便相当于“溢出”,无法combo出m而另┅种可能就是在剩余的n个里恰好满足m==n,即此时 背包刚好填充满输出一组解单元。除此之外再无其他。

注:我们设置flag背包用来标注对應的n+1是否被选中,1表示被选中0则表示未选中,每当满足m==n时则输出一组解。程序容易产生逻辑bug的地方在于length的使用(读者可以思考一下为哬需要全局变量length而不是直接使用n来代替for循环)。

我要回帖

 

随机推荐