题目描述
牛牛最近在家闲的无聊,所以决定在家开一个小超市,为了方便卖东西,牛牛发明了一种用来兑换东西的新型货币,牛牛给这种新型货币起了个名字叫牛币,现在牛牛有n(n<=50)种不同的币值,其中币值为 value(value<=50) 的有 w(w<=20) 个,现在牛妹来到牛牛的超市买东西,牛妹有 x(x<=100) 元牛币,但是牛妹想将 x 元牛币换成若干零钱,请问有多少种换钱的
示例1
输入
2,10,[[1, 5],[ 2, 4]]
输出
2
说明
10元可以由 2张1元的和4张2元的组成,也可以由4张1元的和3张2元的组成
int solve(int n, int x, vector<vector<int> >& a) {
// write code here
int dp[50][101];
for (int i = 0; i < n; i++)
for (int j = 0; j < x + 1; j++)
dp[i][j] = 0;
//dp第一列表示组成钱数为0的方法数,明显为1种.
for (int i = 0; i < n; i++)
dp[i][0] = 1;
//dp第一行表示只能使用a[0][0]的货币情况下,组成钱的方法数.
for (int j = 1; a[0][0] * j <= x && j <= a[0][1]; j++)
dp[0][a[0][0] * j] = 1;
int sum = 0;
//钱数j,dp[i][j]为不用到用了k张的货币的方法的总数.
//完全不用a[i][0]货币,只使用a[0...i-1][0]的货币时,方法数为dp[i-1][j]
//使用k张a[i][0]货币,剩下的钱用a[0...i-1][0]的货币时,方法数为dp[i-1][j-k*a[i][0]]
for (int i = 1; i < n; i++)
for (int j = 1; j <= x; j++)
{
sum = 0;
for (int k = 0; ((j - a[i][0] * k) >= 0) && (k <= a[i][1]); k++)
{
sum += dp[i - 1][j - a[i][0] * k];
}
dp[i][j] = sum;
}
return dp[n-1][x];
}