我有一个操作数组和一个目标数字。
操作可能包括:
+ 3
- 3
* 4
/ 2
我想找出使用这些操作时,我可以接近目标数字的程度。
我从0开始迭代执行这些操作,并且可以选择使用或不使用它们。
例如,如果目标数字是13,我可以使用“+3”和“*4”得到12,这是最接近目标数字13的结果。
我猜我需要计算所有可能的组合(我猜计算次数为2^n,其中n是操作的数量)。
我已经尝试在Java中实现此功能。
import java.util.*;
public class Instruction {
public static void main(String[] args) {
// create scanner
Scanner sc = new Scanner(System.in);
// number of instructions
int N = sc.nextInt();
// target number
int K = sc.nextInt();
//
String[] instructions = new String[N];
// N instructions follow
for (int i=0; i<N; i++) {
//
instructions[i] = sc.nextLine();
}
//
System.out.println(search(instructions, 0, N, 0, K, 0, K));
}
public static int search(String[] instructions, int index, int length, int progressSoFar, int targetNumber, int bestTarget, int bestDistance) {
//
for (int i=index; i<length; i++) {
// get operator
char operator = instructions[i].charAt(0);
// get number
int number = Integer.parseInt(instructions[i].split("\\s+")[1]);
//
if (operator == '+') {
progressSoFar += number;
} else if (operator == '*') {
progressSoFar *= number;
} else if (operator == '-') {
progressSoFar -= number;
} else if (operator == '/') {
progressSoFar /= number;
}
//
int distance = Math.abs(targetNumber - progressSoFar);
// if the absolute distance between progress so far
// and the target number is less than what we have
// previously accomplished, we update best distance
if (distance < bestDistance) {
bestTarget = progressSoFar;
bestDistance = distance;
}
//
if (true) {
return bestTarget;
} else {
return search(instructions, index + 1, length, progressSoFar, targetNumber, bestTarget, bestDistance);
}
}
}
}
目前它还不能正常工作,但我想我离解决问题更近了一步。我只是不知道如何结束我的递归。
也许我不应该使用递归,而应该列出所有的组合。只是我不知道该怎么做。
例如,如果我有3个操作,并且想计算所有的组合,那么我会得到2^3种组合。
111
110
101
011
000
001
010
100
其中,1表示使用该操作,0表示未使用该操作。
实现这个功能应该相对简单,然后选择哪种组合给出了最佳结果(最接近目标数),但我不知道如何在Java中实现。
int[] a = new int[5]; System.out.println(""+a.length);
输出结果为5。 - tucuxi