首页 > 学院 > 开发设计 > 正文

HDU2079 ACM 母函数 解决

2019-11-08 02:46:52
字体:
来源:转载
供稿:网友

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

Time Limit: 1000/1000 MS (java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4519    Accepted Submission(s): 3507PRoblem 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 

这个题 方法也很多, 这里用的母函数 来解决

母函数 

http://blog.csdn.net/sizaif/article/details/55669439

//2079 组合数问题  母函数问题 #include<iostream>#include<cstring>#define min(a,b) ((a)<(b)?(a):(b))  using namespace std;//int min(int a,int b)//{//	return a<b?a:b;//}int main(){	int last,last2;	int i,j,k,nn,T,m;	int v[55],n[55],a[200000],b[200000];	while(cin>>T)	{		while(T--)		{			cin>>nn>>m;			for(i=0;i<m;i++)			{				cin>>v[i]>>n[i];			}			last=0;			a[0]=1;			for(i=0;i<m;i++)			{  				last2=min(last+v[i]*n[i],nn);				memset(b,0,sizeof(int)*(last2+1));				for(j=0;j<=n[i]&&j*v[i]<=last2;j++)//n[i] 表示 有几门课 					for(k=0;k<=last&&k+j*v[i]<=last2;k++)						b[k+j*v[i]]+=a[k];//v[i]表示学分 				memcpy(a,b,sizeof(int)*(last2+1));				last=last2;			}//			for(i=0;i<last;i++)//				cout<<a[i]<<" "<<i<<" "<<last<<endl;			cout<<a[nn]<<endl;					}	}	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表