int countWays(vector<int> penny, int n, int aim)
{
int m = aim + 1;
int **dp = new int*[n];
for (int i = 0; i < n; i++)
dp[i] = new int[m];
if (penny.empty()|| n == 0 || aim < 0)
{
return 0;
}
//矩阵初始化
for (int i = 0; i < n; i++)
{
for (int j = 0; j < aim + 1; j++)
{
dp[i][j] = 0;
}
}
//设置第一行的数目
for (int j = 0; j < aim + 1; j++)
{
if(j%penny[0]==0)
dp[0][j] = 1;
}
//设置第一列的数目,全部为1
for (int i = 0; i < n; i++)
{
dp[i][0] = 1;
}
//设置其他行和列
for (int i = 1; i < n; i++)
{
for (int j = 1; j < aim + 1; j++)
{
if(j - penny[i]>=0)
{
dp[i][j] = dp[i][j - penny[i]] + dp[i - 1][j];
}
else
{
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n - 1][aim];
}
有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。
给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。