Вам дан целочисленный массив coins
, представляющий монеты разного номинала, и целочисленный массив amount
, представляющий общую сумму денег.
Возвращает количество комбинаций, составляющих эту сумму. Если эту сумму денег нельзя компенсировать ни одной комбинацией монет, верните 0
.
Вы можете предположить, что у вас есть бесконечное количество монет каждого вида.
Ответ гарантировано соответствует 32-разрядному целому числу со знаком.
Пример 1:
Input: amount = 5, coins = [1,2,5] Output: 4 Explanation: there are four ways to make up the amount: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1a
Пример 2:
Input: amount = 3, coins = [2] Output: 0 Explanation: the amount of 3 cannot be made up just with coins of 2.
Пример 3:
Input: amount = 10, coins = [10] Output: 1 Constraints: 1 <= coins.length <= 300 1 <= coins[i] <= 5000 All the values of coins are unique. 0 <= amount <= 5000
class Solution { public: // no of ways int change(int amount, vector<int>& coins) { int n=coins.size(); vector<vector<int>> dp(n+1, vector<int> (amount+1, 0)); for(int i=1;i<n+1;i++){ for(int j=0;j<amount+1;j++){ if(j==0) dp[i][j]=1; else if(coins[i-1]<=j) dp[i][j]=dp[i-1][j]+dp[i][j-coins[i-1]]; else dp[i][j]=dp[i-1][j]; } } return dp[n][amount]; } };
Почему ДП? Из-за повторения!!
Наша задача состоит в том, чтобы определить, сколько различных способов мы можем восполнить эту сумму, используя монеты.
Этот вопрос не задает вам ни одного способа … будьте осторожны [1,2,2] или [2,1,2] или [2,2,1] все считаются как 1.
dp[0][1], dp[0][2], ….. dp[0][amount+1] установлен в 0, так как в то время у нас не было монет, поэтому не было возможности.
dp[0][0] установлен в 1 … это означает, что у нас нет монет и нам нужна сумма 0, поэтому есть 1 возможный способ ничего не выбрать
dp[1][0], dp[2][0]…… dp[n+1][0] — все установлены в 1, потому что есть один возможный способ ничего не выбирать.
for dp[2][4] означает, что у вас есть монеты [1,2] из массива nums, и вы должны сделать сумму =4, тогда это возможные способы…
[1,1,1,1] [1,1,2] [2,2]
Аналогично идем со всеми и получаем окончательный ответ в dp[n+1][amount].
Спасибо
Не стесняйтесь задавать любые вопросы или улучшать эту версию :)