HDU 2079 选课时间(题目已修改,注意读题)【母函数】

做题感受:是一道很好的母函数题,通过这题让我对母函数有了更加深刻的认识和理解。那几个for循环我感觉就是在打表,把所有情况都算出来,最后再选取有用的部分。解析见注释部分。

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

Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3250Accepted 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

22 21 22 140 81 12 23 24 25 86 97 68 8

Sample Output

2445

Author

xhd

Source

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

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

真正的强者,不是流泪的人,而是含泪奔跑的人。

HDU 2079 选课时间(题目已修改,注意读题)【母函数】

相关文章:

你感兴趣的文章:

标签云: