【发布时间】:2014-10-02 22:25:55
【问题描述】:
这是一个求职申请的问题: “一个父亲有两个儿子,999幅画。每幅画都有不同的价值:第一幅价值1,第二幅价值2,以此类推,直到最后一幅价值999。他想把他所有的画分成他的两幅。儿子,让每个儿子都得到平等的价值。999幅画有多少种方法? 例子:如果父亲有 7 幅画,他可以通过给第一个儿子画 1,6 和 7 来公平分配它们。第二个儿子将得到 2,3,4 和 5。两者的总和值相等,14。如果有 7 幅画,父亲可以将它们公平地分成 4 种方式(其他 3 种此处未列出),因此解决方案为 4。 提示:这个数字可能很大,所以请将您的解决方案的最后 10 位数字和草图发送给我们。”
我所做的是尝试使用蛮力方法,通过编写一个 c# 程序来添加所有可能的组合,该程序编写它自己的 c# 程序,循环内有循环,如下所示:
StringBuilder sb = new StringBuilder();
for (short i = 2; i <= 999; i++) //starts from 2 because 1 is always added to the total for one side
{
sb.AppendLine("for (byte i" + i.ToString() + " = 0; i" + i.ToString() + " < 2; i" + i.ToString() + "++)");
sb.AppendLine("{");
}
for (int i = 2; i <= 999; i++)
{
sb.Append("if (i" + i.ToString() + " == 1) { total += " + i.ToString() + "; }\n");
}
for (short i = 2; i <= 999; i++)
{
sb.AppendLine("}");
}
然后在结果中的 if 块之后添加:
if (total == 249750)
{
count++; //count is a BigInteger
}
total = 1;
这种方法在技术上应该可行(在少量绘画上进行了测试),但问题是它是一个巨大的数字,在我的计算机上以这种方式计算结果需要大约一百万年......是否有一些数学技巧可以在合理的时间内做到这一点?
【问题讨论】:
-
见鬼,这超出了我的范围:D 目前,至少...
-
是的,我明白这一点,我问不是为了在面试中作弊,我问是为了学习新的东西,并希望为我的技能增加一些新的东西。我发布了链接,以防万一有能力解决问题的人可以申请并满足要求。 (它被mod编辑了,显然这是违反规则的)
-
编码前三思。手动计算一些较小的问题案例。有图案吗?设 f(n) 为 n 幅画的等分分割数。你能写出 f(n) 的递推关系吗?如果没有,定义部分解决方案功能有帮助吗?提示:设 g(n, t) 为长子获得总价值 t 的 n 幅画的分割数。