HDU_2079 选课时间(生成函数)

来源:互联网 发布:淘宝代购店怎么开 编辑:程序博客网 时间:2024/06/14 05:03

题目请点我
题解:
这是自己接触的第一道生成函数的题目,看了很多别人的博客,感觉对于里面的迭代过程还并不是很清晰,先做一些题目试了一下。发现生成函数的题目格式比较固定,变化点不多,但是需要继续去练习才能进一步理解。
母函数详解
什么是生成函数?
代码实现:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#define MAX 10010using 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 45using 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;}
0 0
原创粉丝点击