牛牛的超市

目录

  • 牛课题霸:牛牛的超市

牛课题霸:牛牛的超市

牛牛最近在家闲的无聊,所以决定在家开一个小超市,为了方便卖东西,牛牛发明了一种用来兑换东西的新型货币,牛牛给这种新型货币起了个名字叫牛币,现在牛牛有n(n<=50)种不同的币值,其中币值为 value(value<=50) 的有 w(w<=20) 个,现在牛妹来到牛牛的超市买东西,牛妹有 x(x<=100) 元牛币,但是牛妹想将 x 元牛币换成若干零钱,请问有多少种换钱的方案?

输入
3,6,[ [1, 100],[2, 100], [5, 100] ]

说明:
表示有3种货币,要兑换的金额是6元,
第一种货币面额1,有100张
第二种货币面额2,有100张
第二种货币面额5,有100张

输出
5

使用动态规划算法求解

n\x 0元 1元 2元 3元 4元 5元 6元
0元/币 1 0 0 0 0 0 0
1元/币 1 1 1 1 1 1 1
2元/币 1 1 2 2 3 3 4
5元/币 1 1 2 2 3 4 5

如上表所示,定义dp[n][x]表示有n种货币,x元钱时, 总共的兑换方案。
dp[0][0] = 1

class Solution {
public:
    /**
     * 
     * @param n int整型 :牛币值种类数
     * @param x int整型 :牛妹拥有的钱数
     * @param a int整型vector> :第二个vector中的第一列表示币值,第二列表示牛牛拥有币值的个数
     * @return int整型
     */
    int solve(int n, int x, vector<vector<int> >& a) {
        // write code here
        int dp[n+1][x+1];
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;

        for(int i = 1; i <= n; i++)
            for(int j = 0; j <= x; j++)
            /*
            * 当第i种货币取k个时,剩下的钱换其他货币有dp[i-1][j - k*a[i-1][0]]种方案
            */
                for(int k = 0; k <= a[i-1][1]; k++)
                    if(j - k*a[i-1][0] >= 0) {
                        dp[i][j] += dp[i-1][j - k*a[i-1][0]];
                    } else {
                        break;
                    }
        return dp[n][x];
    }
};

你可能感兴趣的:(牛牛的超市)