如何计算小于n且总和大于n * 2的3个整数的组合数?

时间:2019-01-20 05:30:51

标签: java nested-loops

我正在解决一些Java算法分析问题,而这个问题使我感到困惑。此特定问题要求x(10)返回的值,其中x是以下函数:

public static int x(int n)
{
    int count = 0;
    for(int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            for (int k = 0; k <= n; k++)
            {
                System.out.println(i+","+j+","+k);
                if (i + j + k > 2 * n)
                    count++;
            }
        }
    }
    return count;
}

本质上,问题是要求小于n且和大于n * 2的3个整数的组合数目。

什么是最快的解决问题的技术,而仅仅是一般的“复杂”嵌套循环问题?

我建立了一个变量表,并跟踪代表三个整数的变量a,b和c,以及一个计数变量,每当'a + b + c> n * 2'但在n = 3之后,计数变量都会递增桌子变得不必要地乏味。必须有一个数学解。

x(10)返回220,但我不知道算法如何得出该答案以及如何找到x(7)。

1 个答案:

答案 0 :(得分:0)

您的代码不正确。

  1. 首先,将for循环更正为
i < n,
j < n,
k < n,

因为您提到“少于”。

  1. 正如您提到的“组合”,但是您的代码不会删除某些重复的组合,例如,如果n = 5,则只有两个满足条件的组合,它们分别是(4,4,4 )和(4,4,3),结果是2, 显然,您的代码将返回更大的数字,这是不正确的。

  2. 这个问题的结果可能是数学表达式吗?考虑下面的等式:

         n1 + n2 + n3 = 2 * n

该方程式是一个典型的称为“ Diophantine方程式”的事实,证明 没有通用的算法可以解决所有问题,而且该方程式与起源问题有关,所以我想不。

  1. 我更改了您的代码,使用哈希集删除所有重复的组合,希望对您有所帮助。

    public static int getCombinationNumber(int num) {
        HashSet<String> hs = new HashSet();  // To save the unic form (or representation) for each combination
    
        int count = 0;
        for (int i = 0; i < num; i++)
            for (int j = 0; j < num; j++)
                for (int k = 0; k < num; k++) {
    
                    int[] nums = {i, j, k};
                    sort(nums);   // To ensure all the combinations of i, j, k form a unic array
    
                    String unicForm = Arrays.toString(nums);  // Convert array to string in order to compare and save
    
                    if (i + j + k > 2 * num && !hs.contains(unicForm)) {
                        count++;
                        hs.add(unicForm);
                        System.out.println(i + ", " + j + ", " + k);
                    }
                }
    
        return count;
    }