做題感受:是一道很好的母函數題,通過這題讓我對母函數有了更加深刻的認識和理解。那幾個for循環我感覺就是在打表,把所有情況都算出來,最後再選取有用的部分。解析見註釋部分。
選課時間(題目已修改,注意讀題)
每組數據的第一行是兩個整數n(1 <= n <= 40),k(1 <= k <= 8)。
接着有k行,每行有兩個整數a(1 <= a <= 8),b(1 <= b <= 10),表示學分爲a的課有b門。
#include<stdio.h>
#include<string.h>
int c1[100],c2[100];
int arr[100];
int main()
{
int s,n,k;
int i,j;
int a,b,p;
scanf("%d",&s);
while(s--)
{
scanf("%d%d",&n,&k);
memset(c2,0,sizeof(c2));
memset(c1,0,sizeof(c1));
for(i=0;i<k;i++)
{
scanf("%d%d",&a,&b);
arr[a]=b;// 用我自己的話說就是把用來度量東西的砝碼的單位質量 和 個數 用一個數組存起來
}
for(i=0;i<=arr[1];i++)//第一個括號裏面的項數
//以前那個是n,現在的是arr[1],因爲以前的砝碼的個數是沒有限制的,但現在是有限制的
//(1 + x + x^2 + ... ) 第一個括號一共有arr[1]個這樣的數
c1[i]=1;
for(i=2;i<=8;i++)//有多少個括號,本題爲8個括號 ,因爲有8種學分,故有8個括號
// 有時不知道多少個括號,寫學分數40個也可以
{
for(j=0;j<=40;j++)
for(k=0,p=0;p<=arr[i]&&k+j<=40;k+=i,p++)//p是保證有b門課,在尋找滿足40的條件下,
// 也要不超過b門課的題目要求
c2[k+j] += c1[j];
for(j=0;j<=40;j++)
{
c1[j]=c2[j];
c2[j]=0;
}
}
printf("%d\n",c1[n]);
}
return 0;
}