您的位置:首页 > 其它

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

2016-07-21 16:17 323 查看
点击打开题目


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

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

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

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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: