C ++中的硬币更改2

假设我们有不同面额的硬币和总金额。我们必须编写一个模块来计算构成该数量的组合的数量。我们可以假设每种硬币有无限数量。因此,如果数量为5,硬币为[1、2、5],则有四个组合。(1 + 1 + 1 + 1 + 1),(1 + 1 + 1 + 2),(1 + 2 + 2),(5)

为了解决这个问题,我们将遵循以下步骤-

  • 创建一个大小为d + 1的数组dp

  • dp [0]:= 1

  • n:=硬币阵列的大小

  • 对于i,范围为0至n – 1

    • dp [j]:= dp [j –硬币[i]]

    • 范围内的硬币j [i]等于

    • 返回dp [金额]

    例子(C ++)

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int change(int amount, vector<int>& coins) {
          vector <int> dp(amount + 1);
          dp[0] = 1;
          int n = coins.size();
          for(int i = 0; i < n; i++){
             for(int j = coins[i]; j <= amount; j++){
                dp[j] += dp[j - coins[i]];
             }
          }
          return dp[amount];
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,2,5};
       cout << (ob.change(5, v));
    }

    输入值

    5
    [1,2,5]

    输出结果

    4