HDU 2079 選課時間(題目已修改,注意讀題)【母函數】

做題感受:是一道很好的母函數題,通過這題讓我對母函數有了更加深刻的認識和理解。那幾個for循環我感覺就是在打表,把所有情況都算出來,最後再選取有用的部分。解析見註釋部分。



選課時間(題目已修改,注意讀題)

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3250    Accepted Submission(s): 2551


Problem Description
又到了選課的時間了,xhd看着選課表發呆,爲了想讓下一學期好過點,他想知道學n個學分共有多少組合。你來幫幫他吧。(xhd認爲一樣學分的課沒區別)
 

Input
輸入數據的第一行是一個數據T,表示有T組數據。
每組數據的第一行是兩個整數n(1 <= n <= 40),k(1 <= k <= 8)。
接着有k行,每行有兩個整數a(1 <= a <= 8),b(1 <= b <= 10),表示學分爲a的課有b門。
 

Output
對於每組輸入數據,輸出一個整數,表示學n個學分的組合數。
 

Sample Input
2 2 2 1 2 2 1 40 8 1 1 2 2 3 2 4 2 5 8 6 9 7 6 8 8
 

Sample Output
2 445
 

Author
xhd
 

Source



#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;
} 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章