题目请点我
题解:
这是自己接触的第一道生成函数的题目,看了很多别人的博客,感觉对于里面的迭代过程还并不是很清晰,先做一些题目试了一下。发现生成函数的题目格式比较固定,变化点不多,但是需要继续去练习才能进一步理解。
母函数详解
什么是生成函数?
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 10010
using namespace std;
int T,n,k;
int a[10],b[10];
int c1[MAX],c2[MAX];
int main(){
scanf("%d",&T);
while( T-- ){
scanf("%d%d",&n,&k);
for( int i = 1; i <= k; i++ ){
scanf("%d%d",&a[i],&b[i]);
}
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
for( int i = 0,t = 0; i <= n && t <= b[1]; i += a[1],t++ ){
c1[i] = 1;
}
for( int i = 2; i <= k; i++ ){
for( int j = 0; j <= n; j++ ){
for( int k = 0,t = 0; k+j <= n && t <= b[i];k+=a[i],t++){
c2[j+k] += c1[j];
}
}
for( int j = 0; j <= n; j++ ){
c1[j] = c2[j];
c2[j] = 0;
}
}
printf("%d\n",c1[n]);
}
return 0;
}
dp实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 45
using namespace std;
int a,b;
int T,n,k;
int num[MAX];
int dp[MAX];
int main()
{
scanf("%d",&T);
while( T-- ){
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&k);
for( int i = 0; i < k; i++ ){
scanf("%d%d",&a,&b);
num[a] = b;
}
dp[0] = 1;
//按照哪种课程->选一次->选几个 构造三层for循环
for( int i = 1; i <= 8; i++ ){
for( int j = n; j >= i; j-- ){
for( int k = 1; k<=num[i] && (j-k*i)>=0; k++ ){
dp[j] += dp[j-k*i];
}
}
}
printf("%d\n",dp[n]);
}
return 0;
}