母函数法解决选课问题

#include<stdio.h>
#include<string.h>
#include <windows.h>

int c[45],s[45];
int a[8],b[8];
int main()
{
    int T,i,j,t,n,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&n,&k);
        memset(a,0,sizeof(a));
        memset(s,0,sizeof(s));
        for(i=0;i<k;i++)
        scanf("%d%d",&a[i],&b[i]);
        for(i=0;i<=n&&i<=a[0]*b[0];i+=a[0])
        s[i]=1;      //将第一组数据的系数全部初始化为1
        for(i=1;i<k;i++)                                //i从1开始因为第一次性解决了两项,第二次直接从第三项开始
        {
            for(j=0;j<=n&&j<=a[i-1]*b[i-1];j+=a[i-1])    //j+=a[i-1]为了减少一些不必要的计算||j<=a[i-1]*b[i-1]
            {
                for(t=0;t+j<=n&&t<=a[i]*b[i];t+=a[i])
                c[j+t]+=s[j];                            //j代表前一项的指数,t代表后一项的指数 c[j+t]+=s[j]表示两者相乘时的系数相加
            }
            for(j=0;j<=n;j++)
            {
                s[j]=c[j];  
                c[j]=0;
            }
        }
        printf("%d\n",s[n]);
    }
    system("pause");
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/z2529827226/p/11628846.html