【发布时间】:2014-09-26 06:54:54
【问题描述】:
我在 Authomata 工作,需要三个等于 n 的数字 例如,如果 n = 2,我需要的数字是:
200
020
002
110
101
011
组合是否重复并不重要。
如果 n = 3 我需要:
300
030
003
210
201
021
120
012
102
111
所以我读到这类似于数论中的分区,但我可以得到只有 3 个数字给我目标值 (n) 的特殊情况。 (代码来自我在这里得到的一个例子)
package automata2;
import java.util.ArrayList;
/**
*
* @author jaime
*/
public class Automata2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int N = 14;
partition(N);
}
public static void partition(int n) {
partition(n, n, "");
}
public static void partition(int n, int max, String prefix) {
if (n == 0) {
System.out.println(prefix);
return;
}
for (int i = Math.min(max, n); i >= 1; i--) {
partition(n-i, i, prefix + " " + i);
}
}
}
但我只需要三个数字的所有组合,而不是从 14 到 1 1 1 1 1 1 1 1 1 1 1 1 1 1 的所有组合
【问题讨论】:
-
这里的蛮力有什么问题?
-
我不太确定该怎么做,我尝试了一个 switch 结构,但条件相当困难,我是编程新手,很抱歉,如果这是一个简单的问题。
-
看起来您需要 2 个嵌套的 for 循环来生成所有选项,并且对于每个选项,您可以测试节点是否满足您的条件。之所以称为蛮力,是因为您生成所有可能的解决方案只是为了找到您真正想要的少数解决方案。
-
你能告诉我这个算法吗?
-
@Leo 实际上,两个循环就足够了。第三个数字更适合计算为
N-n1-n2。额外的好处:效率更高。