参考:http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html
i表示只用前i种硬币,sum表示要组合出的面值
下图是当有面值为1,2,5的硬币,要凑出10的dp表
图中dp[2][3]=dp[1][3]+dp[1][1]=2,其中dp[1][3]是第2枚硬币取0的情况;dp[1][1]是第2枚硬币取1的情况,此时还需要凑1分即可。
#include <iostream>
#include <vector>
using namespace std;
int coinCombinations(const vector<int> &coins, int amount){
if(coins.empty()) return 0;
vector<vector<int>> dp(coins.size()+1,vector<int>(amount+1));
for(int i=0;i<=coins.size();++i)
dp[i][0]=1;
for(int i=1;i<=coins.size();++i)
for(int j=1;j<=amount;++j)
for(int k=0;k<=j/coins[i-1];++k)
dp[i][j]+=dp[i-1][j-k*coins[i-1]];
return dp[coins.size()][amount];
}
int main()
{
vector<int> coins{ 1,2,5 };
int sum = 10;
int result = coinCombinations(coins, sum);
cout << result << endl;
return 0;
}