Я просматриваю некоторые алгоритмы и наткнулся на размен монет а> проблема.
Размышляя над проблемой, я придумал это наивное рекурсивное решение:
int coinChange(const vector<int>& coins, int start, int n) {
if (n == 0) return 1;
if (n < 0) return 0;
int total = 0;
for (int i = start; i < coins.size(); ++i) {
if (coins[i] <= n) total += coinChange(coins, i, n-coins[i]);
}
return total;
}
Затем я понял, что «принятое» решение было следующим:
int count( int S[], int m, int n )
{
// If n is 0 then there is 1 solution (do not include any coin)
if (n == 0)
return 1;
// If n is less than 0 then no solution exists
if (n < 0)
return 0;
// If there are no coins and n is greater than 0, then no solution exist
if (m <=0 && n >= 1)
return 0;
// count is sum of solutions (i) including S[m-1] (ii) excluding S[m-1]
return count( S, m - 1, n ) + count( S, m, n-S[m-1] );
}
Сначала я подумал, что эти две вещи по сути одинаковы. Мне было ясно, что мое дерево рекурсии было намного шире, но казалось, что это было только потому, что мой алгоритм делал больше работы на каждом уровне, поэтому он выравнивался. Похоже, что оба алгоритма учитывают количество способов внесения сдачи с текущей монетой (при условии, что ‹= текущая сумма) и количество способов внести сдачу без текущей монеты (таким образом, со всеми элементами в массив монет минус текущая монета). Поэтому параметр start
в моем алгоритме делал практически то же самое, что и m
во втором алгоритме.
Однако, чем больше я смотрю на это, кажется, что независимо от предыдущего текста мой алгоритм — O(n^n)
, а второй — O(2^n)
. Я слишком долго смотрел на это, но если бы кто-нибудь мог объяснить, какую дополнительную работу выполняет мой алгоритм по сравнению со вторым, это было бы здорово.
РЕДАКТИРОВАТЬ
Я понимаю решение этой проблемы с помощью динамического программирования, этот вопрос основан исключительно на сложности.
n_sub_0
такое, что f (n) = O (2 ^ n) и f (n) = Omega (2 ^ n). ), для всехn >= n_sub_0
, можно ли это сделать в данной конкретной ситуации? - person Dominic Farolino   schedule 18.07.2016closer and closer
- это то, о чем я тоже подумал.. спасибо - person Dominic Farolino   schedule 18.07.2016