// Входные данные - монеты.
int coints[100];
int num_coins;
// Данные перебора - сколько каждой монеты взяли.
int taken[100];
// Параметры - сколько осталось разменять
// и какую самую большую монету еще можно брать.
void Generate(int left, int max_coin_idx) {
if (left == 0) {
// Вывод текущего размена.
for (int c = 0; c < num_coins; ++c) {
for (int i = 0; i < taken[c];++i) {
printf("%d ", coins[c]);
}
}
printf("\n");
return;
}
if (max_coin_idx < 0) return;
for (int cur = 0; cur*coins[max_coin_idx] <= left; ++cur) {
taken[max_coin_idx] = cur;
Generate(left - cur*coins[max_coin_idx], max_coin_idx-1);
}
// Важно! Отчистить глобальный массив от мусора.
// другая ветка рекурсии может найти размен не дойдя
// до этой монеты.
taken[max_coin_idx] = 0;
return;
}
// Вызов перебора.
Generate(n, num_coins-1);
const int kMaxN = 100000;
int count[kMaxN+1];
int Count(int n)
...
if (
arrayList[i][1] === 1 &&
arrayList[i + 1][1] === -1
)
best_length = 0;
for (b1 = 0; b1 < n; ++b1) {
for(b2 = b1+1; b2 < n; ++b2) {
i = 0;
// Если куски не могут пересекаться, то надо еще проверить, что b1+i<b2.
while (b2+i < n && s[b1+i] == s[b2+i]) {
++i;
}
if (i > best_length) {
best_length = i;
best_beg = b1;
}
}
}
// Вывести кусок с best_beg длиной best_length.