Я создал этот алгоритм для решения проблемы, используя стратегию возврата.Задача состоит в следующем:
Задано множество A из n целых чисел и двух целочисленных значений, m и c.Вычислить все подмножества A, m элементов, чтобы сумма их значений была c.
Алгоритм (в Java) :
public class Algorithm {
private List<Integer> a;
private int m;
private int c;
/**
* @param a Initial set
* @param m Maximum number of elements stored in the subset
* @param c Desired sum
*/
Algorithm(List<Integer> a, int m, int c) {
this.m = m;
this.c = c;
this.a = a;
findSubsets(0, new int[m], 0, 0);
}
/**
* @param i Index to go through the initial set
* @param subset Solution candidate
* @param level Current number of elements stored in the subset
* @param sum Current sum of the elements stored in the subset
*/
private void findSubsets(int i, int[] subset, int level, int sum) {
// Base case
if (level == m) {
if (sum == c) {
System.out.println(Arrays.toString(subset));
}
}
// Exploration
else {
while (i < a.size()) {
subset[level] = a.get(i);
findSubsets(i + 1, subset, level + 1, sum + a.get(i));
i++;
}
}
}
}
Сложность по времени:
С этим решением я экспериментально определил, что когда m стремится к n, сложность стремится к O (2 ^ n).Однако после прочтения руководств о том, как рассчитать сложность времени, я пока не могу определить этот результат математически.Я также очень заинтересован в среднем случае, и я очень растерялся из-за того, как его вычислить.
Я знал, что это может быть вопрос новичка, но я был бы очень признателен, если бы кто-нибудь мог мне помочь!Спасибо