牛牛的超市 解题报告

这是一个母函数的题目,其实跟经典的砝码问题没有什么区别。
砝码问题
假设现在有1克砝码2个,2克砝码1个,4克砝码2个,问能够称出哪些重量,方案数有多少?
解:
可以列出不定方程:
1x1 + 2x2 + 4x3 == r;(0<=x1<=2, 0<=x2<=1, 0<=x3<=2)
所以对应的母函数为:
G(x) = (1+x+x^2) * (1+x^2) * (1+x^4+x^8) = 1+x+2
x^2+x^3+2x^4+x^5+2x^6+x^7+2x^8+x^9+2x^10+x^11+x^12
其中 x 的指数就是能够称的重量,而 x 前面的系数就是能够称的重量的方案数;

所以对于这个题来说,就可以看做一个砝码问题,对于样例来说,就可以列出母函数:
G(x) = (1+x+x^2+..+x^5) * (1+x^2+x^4+x^6+x^8)
所以可以解得 x^10 前面的系数为2,即结果为2。
代码:

const int MAXN = 1005;
int ans[MAXN], t[MAXN];
class Solution {
public:
    /**
     * 
     * @param n int整型 :牛币值种类数
     * @param x int整型 :牛妹拥有的钱数
     * @param a int整型vector<vector<>> :第二个vector中的第一列表示币值,第二列表示牛牛拥有币值的个数
     * @return int整型
     */
    int solve(int n, int x, vector<vector<int> >& a) {
        // write code here
        ans[0] = 1;
        for(int i=0; i<n; i++){
            for(int j=0; j<=x; j++) for(int u=0,k=0; u<=a[i][1]&&j+k<=x; u++,k+=a[i][0]) t[j+k] += ans[j];
            for(int j=0; j<=x; j++){
                ans[j] = t[j];
                t[j] = 0;
            }
        }
        return ans[x];
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
用微笑面对困难:你出于礼貌叫了人一声大姐,大姐很欣慰,她真把你当老弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务