我正在尝试按照以下步骤用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);
}
谁能告诉我我的代码有什么问题?还是按照上述步骤解决该问题?
答案 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