Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将数组划分为3组_Algorithm_Divide And Conquer_Subset Sum_Arrays - Fatal编程技术网

Algorithm 将数组划分为3组

Algorithm 将数组划分为3组,algorithm,divide-and-conquer,subset-sum,arrays,Algorithm,Divide And Conquer,Subset Sum,Arrays,给定一个整数数组,将数组划分为3个集合,使3个集合的元素之和尽可能接近 我的方法如下: 按降序对数组排序 将元素插入总和最小的集合中。 谁能告诉我我的解决方案有什么问题吗?或者可以建议一个更好的解决方案这里是可以使用的蛮力java解决方案,请注意,这个解决方案的复杂性是O3^N,这非常慢 /** * Returns absolute difference between 3 values in array */ static int getdiff(final int s[]) {

给定一个整数数组,将数组划分为3个集合,使3个集合的元素之和尽可能接近

我的方法如下:

按降序对数组排序 将元素插入总和最小的集合中。
谁能告诉我我的解决方案有什么问题吗?或者可以建议一个更好的解决方案

这里是可以使用的蛮力java解决方案,请注意,这个解决方案的复杂性是O3^N,这非常慢

/**
 * Returns absolute difference between 3 values in array
 */
static int getdiff(final int s[])
{
    return Math.abs(s[0] - s[1]) + Math.abs(s[1] - s[2]) + Math.abs(s[2] - s[0]);
}

/**
 * Calculates all possible sums and returns one where difference is minimal
 */
static int[] getsums(final int a[], final int idx, final int[] s)
{
    // no elements can be added to array, return original
    if (idx >= a.length)
        return s;

    // calculate 3 different outcomes
    final int[] s1 = getsums(a, idx + 1, new int[] {s[0] + a[idx], s[1], s[2]});
    final int[] s2 = getsums(a, idx + 1, new int[] {s[0], s[1] + a[idx], s[2]});
    final int[] s3 = getsums(a, idx + 1, new int[] {s[0], s[1], s[2] + a[idx]});

    // calculate difference
    final int d1 = getdiff(s1);
    final int d2 = getdiff(s2);
    final int d3 = getdiff(s3);

    if ((d1 <= d2) && (d1 <= d3))
        return s1;
    else if ((d2 <= d1) && (d2 <= d3))
        return s2;
    else
        return s3;
}

static int[] getsums(final int a[])
{
    return getsums(a, 0, new int[] {0, 0, 0});
}

static void printa(final int a[])
{
    System.out.print("[");
    for (final int t : a)
        System.out.print(t + ",");
    System.out.println("]");
}

static public void main(final String[] args)
{
    final int a[] = new int[] {23, 6, 57, 35, 33, 15, 26, 12, 9, 61, 42, 27};

    final int[] c = getsums(a);

    printa(a);
    printa(c);
}

你的算法如何处理负数?是什么让你认为你的解决方案有问题?或者,对于这个问题,是什么让你认为这是一个好的解决方案呢?我没有得到想要的输出,而且我想先得到正整数的算法。@MonelGupta,试着解释一下想要的输出是什么。请提供输入和不需要的输出。数组是[3,4,1,3],第一个集合是{3},第二个集合是{3,1},第三个集合是{4}。我认为会有一个动态规划解决方案。@MonelGupta不,这是NP完全问题,并且
/**
 * Returns absolute difference between 3 values in array
 */
static int getdiff(final int s[])
{
    return Math.abs(s[0] - s[1]) + Math.abs(s[1] - s[2]) + Math.abs(s[2] - s[0]);
}

/**
 * Calculates all possible sums and returns one where difference is minimal
 */
static int[] getsums(final int a[], final int idx, final int[] s)
{
    // no elements can be added to array, return original
    if (idx >= a.length)
        return s;

    // calculate 3 different outcomes
    final int[] s1 = getsums(a, idx + 1, new int[] {s[0] + a[idx], s[1], s[2]});
    final int[] s2 = getsums(a, idx + 1, new int[] {s[0], s[1] + a[idx], s[2]});
    final int[] s3 = getsums(a, idx + 1, new int[] {s[0], s[1], s[2] + a[idx]});

    // calculate difference
    final int d1 = getdiff(s1);
    final int d2 = getdiff(s2);
    final int d3 = getdiff(s3);

    if ((d1 <= d2) && (d1 <= d3))
        return s1;
    else if ((d2 <= d1) && (d2 <= d3))
        return s2;
    else
        return s3;
}

static int[] getsums(final int a[])
{
    return getsums(a, 0, new int[] {0, 0, 0});
}

static void printa(final int a[])
{
    System.out.print("[");
    for (final int t : a)
        System.out.print(t + ",");
    System.out.println("]");
}

static public void main(final String[] args)
{
    final int a[] = new int[] {23, 6, 57, 35, 33, 15, 26, 12, 9, 61, 42, 27};

    final int[] c = getsums(a);

    printa(a);
    printa(c);
}
[23,6,57,35,33,15,26,12,9,61,42,27,]
[115,116,115,]