【杭电oj】2079 - 选课时间(母函数)

来源:互联网 发布:淘宝号为什么会被监控 编辑:程序博客网 时间:2024/05/26 14:09

点击打开题目

选课时间(题目已修改,注意读题)

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


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
22 21 22 140 81 12 23 24 25 86 97 68 8
 

Sample Output
2445
 

Author
xhd
 

Source
ACM程序设计期末考试_热身赛(感谢 xhd & 8600)



因为同样分数的课程在他看来都一样,所以仍然是母函数。

注意题目要求修 n 分,大于 n 分的不要。


#include <cstdio>#include <cstring>int main(){int n,k,u;int ant[10];int c[44];int t[44];scanf ("%d",&u);while (u--){memset (ant,0,sizeof (ant));memset (c,0,sizeof (c));memset (t,0,sizeof (t));scanf ("%d %d",&n,&k);//修n个学分,k门课for (int i = 1 ; i <= k ; i++){int t1,t2;scanf ("%d %d",&t1,&t2);ant[t1] = t2;}for (int i = 0 ; (i <= ant[1]) && (i <= 40) ; i++)c[i] = 1;for (int i = 2 ; i <= 8 ; i++){for (int j = 0 ; j <= 40 ; j++)for (int k = 0 ; (k <= ant[i] * i) && (k+j <= 40) ; k += i)t[j+k] += c[j];for (int j = 0 ; j <= 40 ; j++){c[j] = t[j];t[j] = 0;}}printf ("%d\n",c[n]);}return 0;}


0 0
原创粉丝点击