具有最小总和差的均匀分区

时间:2018-09-16 23:05:13

标签: java algorithm

我正在尝试按照以下步骤用Java编写此算法:(我知道其他解决方案,只是想弄清楚这个解决方案)

int min_diff = LARGE_NUMBER;
int diff;
for (each subset S of size n/2 of A) {
    diff = abs(sum(S) – sum(A-S));
    if (diff < min_diff) {
        min_diff = diff;
        TempSet = S;
     }

 }
print min_diff, TempSet;

我尝试使用以下链接中的代码找到大小为n / 2的所有子集排列:https://www.geeksforgeeks.org/print-subsets-given-size-set/ 此链接中的代码显示所有排列。我以为首先需要将数组存储在ArrayList中,以便可以在for循环中使用它们,但是我无法使其工作。下面的代码给出了错误的输出(每个数组都是60 60 60而不是排列:

static List<int[]> intArrays = new ArrayList<>();

static void combinationUtil(int[]arr, int n, int r, int index, int[] data, int i)
{

    if (index == r) {           
        intArrays.add(data);
        return;           
    }

    if (i >= n)
        return;

    data[index] = arr[i];
    combinationUtil(arr, n, r, index + 1, data, i + 1);
    combinationUtil(arr, n, r, index, data, i + 1);


}

static void printCombination(int arr[], int n, int r)
{

    int data[] = new int[r];
    combinationUtil(arr, n, r, 0, data, 0);
    for(int[] arr1:intArrays){
      System.out.println(Arrays.toString(arr1));
    }
}

public static void main(String[] args)
{
    int arr[] = { 10, 20, 30, 40,50,60};
    int n=arr.length;
    int r=n/2;

    printCombination(arr, n, r);
}

谁能告诉我我的代码有什么问题?还是按照上述步骤解决该问题?

1 个答案:

答案 0 :(得分:0)

您的问题是您何时Double methodName(Object calcOption, Double answer, String ordinal) { boolean operandLoop = false; while (!operandLoop) { System.out.print("Enter " + ordinal + " operand: "); String operand = calcOption.next(); // retrieve value if (operand.equals("RESULT")) { return answer; // If I want to use the previous result as my input } else { try { return Double.parseDouble(operand); // Assumes that if it isn't RESULT, then I'll want to put in a number } catch (NumberFormatException nfe) { // necessary if I type anything else in besides RESULT and a double throw new RuntimeException("Error: Invalid input! Correct inputs are any real number and \"RESULT\"!"); } } } }

intArrays.add(data);始终包含对intArrays数组的引用。该数组通过引用传递。您得到{60,60,60},因为它是data数组的最后状态(最后一个子集)。

要解决此问题,您必须执行data(如果存在)intArrays.add(data.Clone());种功能或您所用语言中的类似功能,或者自行实现。

C#中的代码。抱歉,我没有安装任何Java编译器。

Clone