hdu 2079 选课时间(题目已修改,注意读题)
2015-08-10 18:53
225 查看
选课时间(题目已修改,注意读题)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3443 Accepted Submission(s): 2713
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
思路:还是普通型母函数。注意这道题目中,不一定是从学分1开始的。初始化的时候要注意。
#include<stdio.h> #include<string.h> int main() { int T,i,j,k,a,b,n,K,num[10]; int c1[45],c2[45],h[45]; int mini; scanf("%d",&T); while(T--) { memset(h,0,sizeof(h)); int w=1; mini=100; scanf("%d%d",&n,&K); for(i=1;i<=K;i++) { scanf("%d%d",&a,&b); num[a]=b; h[w++]=a; } memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=0;i<=num[h[1]]*h[1];i+=h[1]) //初始化跟前面略有不同,本质效果一样。 { c1[i]=1; } for(i=2;i<=K;i++) { for(j=0;j<=n;j++) { for(k=0;k*h[i]+j<=n&&k<=num[h[i]];k++) c2[k*h[i]+j]+=c1[j]; } for(j=0;j<=n;j++) { c1[j]=c2[j]; c2[j]=0; } } printf("%d\n",c1 ); } return 0; }
相关文章推荐
- hdoj-2141 Can you find it?【二分】
- 了解 Spring Data JPA
- 没有真正理解ListView啊,竟然还使用了这么长时间
- MySQL索引建立、优点、不足
- spring异常处理
- Eclipse工程项目前有红色的感叹号
- java的一些基础
- 并查集详解(转)
- URAL 2056 Scholarship 水题
- jQuery 获取url中的参数
- shelll编程-项目笔记
- ulua+PureMVC框架简单热更新使用
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- Java "=="和"equal"
- Matlab绘图函数
- Astyle格式化插件
- C++ opencv 数字识别
- 操作手册_MyEclipse
- VS2008不能全文搜索的解决办法
- sql server自动生成编号