牛牛的超市

题目描述
牛牛最近在家闲的无聊,所以决定在家开一个小超市,为了方便卖东西,牛牛发明了一种用来兑换东西的新型货币,牛牛给这种新型货币起了个名字叫牛币,现在牛牛有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];
    }

版权声明:本文为Ypsilanti原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。