淘宝笔试最后一题!!!!!!!!!!
有N个鸡蛋和M个篮子,把鸡蛋放到篮子里,每个篮子都不为空,要求:对于任意一个小于N的数量,都能找到几个篮子里鸡蛋的和等于这个数量,输入M、N,输出所有鸡蛋的方法。
[解决办法]
N=1+2+4+..2^n+m
m<2^n
下面的自己弄,比较好弄
[解决办法]
/// <summary>
/// 随即放置鸡蛋
/// </summary>
/// <param name="result">结果</param>
/// <param name="beginIndex">开始索引</param>
/// <param name="total">鸡蛋数</param>
public static void RandomLay(int[] result, int index, int total)
{
// iMax为index对应可取鸡蛋数上限
int iMax = 1, basketNum = result.Length;
for (int j = 0; j < index; j++)
{
iMax += result[j];
}
// 复制
int[] copyResult = new int[basketNum];
for (int i = 0; i < basketNum; i++)
{
copyResult[i] = result[i];
}
// 结束条件1:已为最后一个篮子
if (index == basketNum - 1)
{
int mBasket = total - iMax + 1;
if (mBasket <= iMax)
{
copyResult[index] = mBasket;
Console.Write("Split solution: ");
foreach (int res in copyResult)
Console.Write(res + " ");
Console.WriteLine();
}
return;
}
for (int ii = copyResult[index - 1]; ii <= iMax; ii++)
{
// 结束条件2:当前至少需要鸡蛋数
int nowNum = ii * (basketNum - index) + iMax - 1;
// 表示无法再按升序放置鸡蛋
if (nowNum > total)
break;
copyResult[index] = ii;
RandomLay(copyResult, index + 1, total);
}
}
}
}
[解决办法]
今天早上用C++写完了,考虑所有可能的情况。主要是几个约束条件。这题目复杂度的增加不是线性的,后面有好多种方式。大家有兴趣可以看看,有错的过不清楚的可以交流下。
论坛上贴代码不太会用,放我博客里了,看起来清爽些:
http://blog.csdn.net/hiyounger/archive/2011/03/29/6285553.aspx