То, что вы пытаетесь решить, на самом деле является перефразировкой проблемы коммивояжера , и Google предоставит вам множество возможных алгоритмов для ее решения.
Ваш алгоритм ничего не делает при назначении оценок, оптимизация отсутствует. С тем же успехом вы можете привести оценки и учащихся в порядок и просто назначить каждый другому. Это создаст возможный набор для решения, но это (возможно, 1 шанс из) не будет оптимальным.
Прежде чем реализовать алгоритм, попробуйте выразить его в псевдоязычных терминах. Тривиальная реализация алгоритма может выглядеть так:
foreach student S do
foreach unassigned grade G do
Add {G, S} to the solutions
Compute the solution score
If (this score > greater score so far) Then
Keep solution like this
Mark G as assigned
Else
Remove {G, S} from the solution
Next
Next
Что касается структур данных, вы можете иметь в Java:
// The number of grades and students
public static final int N = 10;
// The students and grades are just a suite of numubers
List<int> students = new ArrayList<int>(N);
List<int> grades = new ArrayList<int>(N);
for (int i=0; i<N; ++i) {
students.set(i, i);
grades.set(i, i);
}
// Each score for a possible pair of grade student is stored in a matrix
int[][] scores = new int[N][N];
for (int s=0; s<N; ++s) {
for (int g=0; g<N; ++g) {
scores[s][g] = students.get(s) * grades.get(g);
}
}
// An association of student and grade
class Association {
int student;
int grade;
int score;
public Association(int student, int grade, int score) {
this.student = student;
this.grade = grade;
this.score = score;
}
}
// The solution
Stack<Association> solution = new Stack<Association>(N);
Я позволю вам попытаться реализовать описанный выше алгоритм с этими структурами данных, используя Stack.push и Stack.pop, чтобы добавить / удалить ассоциацию из решения, и List.remove, чтобы пометить оценку как используемую в решении.
Не забудьте реализовать функцию, которая вычисляет сумму баллов в текущем решении (это может выглядеть примерно так: public int getSolutionScore (Stack solution))