[518] Coin Change 2

You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that you have infinite number of each kind of coin.

Example 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+1

Example 2:

Input: amount = 3, coins = [2]
Output: 0
Explanation: the amount of 3 cannot be made up just with coins of 2.

Example 3:

Input: amount = 10, coins = [10] 
Output: 1

Note:

You can assume that

  • 0 <= amount <= 5000
  • 1 <= coin <= 5000
  • the number of coins is less than 500
  • the answer is guaranteed to fit into signed 32-bit integer
 1 class Solution {
 2 public:
 3     int change(int amount, vector<int>& coins) {
 4         vector<int>dp(amount + 1 , 0);
 5         dp[0] = 1;
 6         for(int i : coins) {
 7             for(int j = i;j<=amount;++j) {
 8                 dp[j] += dp[j - i];
 9             }
10         }
11         return dp[amount];
12     }
13 };

思路:动规问题的核心就是状态递归方程,本题为f(n)=f(n-coin[0])+f(n-coin[1])+...+f(n-coin[n])(假设n>coin[n]);

原文地址:https://www.cnblogs.com/Swetchine/p/11161444.html