Algorithm 找出平均分配的可能性数量
假设我们有8个糖果袋。每个袋子都装有糖果Algorithm 找出平均分配的可能性数量,algorithm,Algorithm,假设我们有8个糖果袋。每个袋子都装有糖果1,2,3,4,5,6,7,8 糖果必须在两个人之间分发,这样每个人都能收到相同数量的糖果。每个人收到多少糖果袋并不重要 例如,{1,2,3,4,8}和{5,6,7}是一种可能性。另一种可能性是{3,4,5,6}和{1,2,7,8} 我们必须计算出可能性的总数 我可以考虑使用蛮力算法来计算和并检查是否相等。但是这个解决方案在我看来并不好 我该如何回答这个问题?这是一个众所周知的问题:你可以通过注意总共有36种糖果来减少需要检查的可能性,因此每个人只需要收到
1,2,3,4,5,6,7,8
糖果必须在两个人之间分发,这样每个人都能收到相同数量的糖果。每个人收到多少糖果袋并不重要
例如,{1,2,3,4,8}
和{5,6,7}
是一种可能性。另一种可能性是{3,4,5,6}
和{1,2,7,8}
我们必须计算出可能性的总数
我可以考虑使用蛮力算法来计算和并检查是否相等。但是这个解决方案在我看来并不好
我该如何回答这个问题?这是一个众所周知的问题:你可以通过注意总共有36种糖果来减少需要检查的可能性,因此每个人只需要收到18种糖果。你可以通过注意到每个人最多可以拥有5个袋子来进一步减少它,因为没有6个袋子或更多袋子的组合,其总和是一个人收到的糖果总数。{1,2,3,4,8}之和为18,{5,6,7}之和为18。同样地{3,4,5,6}和{1,2,7,8}加起来各为18。我希望你的疑问是清楚的。事实上,行李的数量固定在8,这意味着暴力枚举所有256种可能性实际上根本没有问题。考虑这个问题的一般化版本是有趣的,我们有一些(4个数)的数目。通过指出解是成对的来进一步减少因子2:例如{1,2,3,4,8}和{5,6,7}与{5,6,7}和{1,2,3,4,8}配对;只需列举一个,我们就可以将找到的数字乘以2。为了使@Henry的建议“可行”,我们需要做的就是从一开始就决定第1个人将携带某个特定的袋子,例如袋子8。这是可行的,因为两个人中必须有一个带着8号包。这也意味着我们现在只需要找到2-4个其他包的组合,加起来正好是10个(这就是为什么8号包比1号包更好的选择)。亨利说得好。我的算法假设人1有{123448}和人2{567}与人1{567}和人2{123448}是不同的情况。OP没有具体说明这些情况是相同还是不同。无论哪种方法,迭代次数都可以减少2倍,正如你所说的。这是一个非常特殊的例子。也许有一些额外的结构可以利用?(不过我还没看到。)
#include <stdio.h>
int main ()
{
int num_possibilities = 0;
int sum;
int a, b, c, d, e;
for (a = 1; a <= 8; a++) {
for (b = a + 1; b <= 8; b++) {
for (c = b + 1; c <= 8; c++) {
sum = a + b + c;
if (sum == 18) {
num_possibilities++;
printf ("%d %d %d\n", a, b, c);
continue;
}
for (d = c + 1; d <= 8; d++) {
sum = a + b + c + d;
if (sum == 18) {
num_possibilities++;
printf ("%d %d %d %d\n", a, b, c, d);
continue;
}
for (e = d + 1; e <= 8; e++) {
sum = a + b + c + d + e;
if (sum == 18) {
num_possibilities++;
printf ("%d %d %d %d %d\n", a, b, c, d, e);
continue;
}
}
}
}
}
}
printf ("Number of possibilities = %d", num_possibilities);
}