Algorithm 找出平均分配的可能性数量

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种糖果来减少需要检查的可能性,因此每个人只需要收到

假设我们有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种糖果来减少需要检查的可能性,因此每个人只需要收到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);
}