1. 程式人生 > >(基本母函式 + 指數型母函式)【板子】

(基本母函式 + 指數型母函式)【板子】

啥時候忘了就及時學習學習:
連結如下 :
母函式
指數型母函式
相關PPT

因為都是板子題,不解釋啦

基本母函式板子:

題意:給你一些水果,讓你從中挑選m個水果,並且規定每種水果挑選時的數量,求方案數

參考程式碼

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long ll;

const int maxn = 1e5 + 10;
#define mem(a) memset(a, 0, sizeof a)
int a[maxn],b[maxn]; int s1[maxn],s2[maxn]; void init() { mem(a); mem(b); mem(s1); mem(s2); } int main() { int n,m; while (~scanf("%d%d", &n, &m)) { init(); for (int i = 0; i < n; i++) { scanf("%d%d", &s1[i], &s2[i]); } for
(int i = s1[0]; i <= s2[0]; i++) a[i] = 1; for (int i = 1; i < n; i++) { mem(b); for (int j = 0; j <= m; j++) { for (int k = s1[i]; k <= s2[i]; k++) { b[j + k] += a[j]; } } memcpy(a, b, sizeof
b); } printf("%d\n", a[m]); } return 0; }

基本指數型母函式板子:

題意: 給你一些球,然後給你每個球的數量,讓你球挑選r個球,的方案數

參考程式碼

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long ll;

const int maxn = 1e5 + 10;
#define mem(a) memset(a, 0, sizeof a)

double a[maxn],b[maxn]; // 注意為浮點型

int s1[maxn];

double f[11];
void init() {
    mem(a);
    mem(b);
    mem(s1);
    f[0] = 1;
    for (int i = 1; i <= 10; i++) {
        f[i] = f[i - 1] * i;
    }
}

int main() {
    int n,m;
    while (~scanf("%d%d", &n, &m)) {
       init();
       for (int i = 0; i < n; i++) {
            scanf("%d", &s1[i]);
       }
        for (int i = 0; i <= s1[0]; i++) a[i] = 1.0 / f[i];
        for (int i = 1; i < n; i++) {
            mem(b);
            for (int j = 0; j <= m; j++) {
                for (int k = 0; k <= s1[i] && k + j <= m; k++) {
                    b[j + k] += a[j] * 1.0 / f[k]; //注意這裡
                }
            }
            memcpy(a, b, sizeof b);
        }
       printf("%.0f\n", a[m] * f[m]);
    }
    return 0;
}