(基本母函式 + 指數型母函式)【板子】
阿新 • • 發佈:2018-12-31
啥時候忘了就及時學習學習:
連結如下 :
母函式
指數型母函式
相關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;
}