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


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

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


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

題目大意:給定要修的學分 ,以及各個學分有幾門課
思路:母函數
2014,12,3

#include<stdio.h>
#include<string.h>
int main(){
int t,i,j,k,s,a,b,g[50],x[50],y[50],m,n;
scanf("%d",&t);
while(t--){
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(g,0,sizeof(g));
scanf("%d%d",&m,&n);
for(i=1;i<=n;i++){
scanf("%d%d",&a,&b);
g[a]=b;//記錄不同學分的課程各有幾個
}
for(i=0;i<=g[1];i++)//注意這個g[1],因為1學分的課只有這么多個,所以如果只選1學分的課最多能選的分數就是g[1]
x[i]=1;
for(i=2;i<=8;i++){//1的情況上邊已經初始化過,所以從2開始//最多的學分是8
for(j=0;j<=40;j++)//j表示合並完的括號內第i個變量的系數
for(k=0,s=0;s<=g[i]&&k+j<=40;k+=i,s++)//s表示這個學分的有幾個
y[k+j]+=x[j];
for(j=0;j<=40;j++){
x[j]=y[j];
y[j]=0;
}
}
printf("%d\n",x[m]);
}
return 0;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com