Java多线程|寻找所有可能性

Java多线程|寻找所有可能性,java,multithreading,for-loop,Java,Multithreading,For Loop,我试图制作一个简单的程序,用美式足球中可用的得分方法找到所有得分的可能性 这是我的代码,它可以工作并返回所有可能的分数 for (int a = 0; (a * sf) <= score; a++) { for (int b = 0; (b * fg) + (a * sf) <= score; b++) { for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) {

我试图制作一个简单的程序,用美式足球中可用的得分方法找到所有得分的可能性

这是我的代码,它可以工作并返回所有可能的分数

for (int a = 0; (a * sf) <= score; a++) {
        for (int b = 0; (b * fg) + (a * sf) <= score; b++) {
            for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) {
                for (int d = 0; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; d++) {
                    for (int e = 0; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; e++) {
                        if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == score) {
                            count++;
                            // System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC ");
                        }
                    }
                }
            }
        }
    }

for(int a=0;(a*sf)非常确定您只能在外部for循环上执行最小/最大值。查看它是否像这样工作:

for (int a = min; (a * sf) <= max; a++) {
    for (int b = 0; (b * fg) + (a * sf) <= score; b++) {
        for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) {
            for (int d = 0; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; d++) {
                for (int e = 0; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; e++) {
                    if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == score) {
                        count++;
                        // System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC ");
                    }
                }
            }
        }
    }
}

for(int a=min;(a*sf)是的……这看起来很简单。@MuratK。那你为什么发表这篇文章而不提出任何建议呢?你的问题真的需要一个而不仅仅是片段。你提供的代码中没有提到线程。你有什么问题吗?FWIW我认为每个CPU核心有一个以上的线程没有任何价值。看起来你可以只划分外部线程按该数字循环,并为每个核心分配相等的工作量。您不能只替换嵌套循环中的分数值。只有外部循环可以拆分(如DL建议的)他写了一个很好的答案,除了关于线程和内核的BS,显然他就是解释不了better@GabrielVince-该算法是非常CPU密集型的,或者可能是I/O受限的,因此将线程数增加到计算机上的CPU数之外不太可能提高性能。这就是我使用102的目的您的机器上有4个内核。
for (int a = min; (a * sf) <= max; a++) {
    for (int b = 0; (b * fg) + (a * sf) <= score; b++) {
        for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) {
            for (int d = 0; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; d++) {
                for (int e = 0; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; e++) {
                    if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == score) {
                        count++;
                        // System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC ");
                    }
                }
            }
        }
    }
}
public class ScoresTest implements Runnable {

    public static final int SCORE = 500;
    public static final int SF = 2;
    public static final int FG = 3;
    public static final int TD = 6;
    public static final int TE = 7;
    public static final int TD2 = 8;

    int min;
    int max;

    public ScoresTest(int min, int max) {
        this.min = min;
        this.max = max;
    }

    @Override
    public void run() {
        for (int a=min/SF; a*SF <= max; a++) {
            for (int b=0; a*SF + b*FG <= SCORE; b++) {
                for (int c=0; a*SF + b*FG + c*TD <= SCORE; c++) {
                    for (int d=0; a*SF + b*FG + c*TD + d*TE <= SCORE; d++) {
                        for (int e=0; a*SF + b*FG + c*TD + d*TE + e*TD2 <= SCORE; d++) {
                            if (a*SF + b*FG + c*TD + d*TE + e*TD2 == SCORE) {
                                System.out.println("SF: " + a + ", FG: " + b + ", TD: " + c + ", TE: " + d + ", TD2: " + e);
                            }
                        }
                    }
                }
            }
        }
    }

    public static void main(String args[]) {
        Thread thread1 = new Thread(new ScoresTest(0, 124));
        Thread thread2 = new Thread(new ScoresTest(126, 248));
        Thread thread3 = new Thread(new ScoresTest(250, 374));
        Thread thread4 = new Thread(new ScoresTest(376, 500));

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
    }

}