标签:母函数
11 26
4 13
//考查知识点:简单母函数进阶版----二维母函数 表示苦涩难懂。。。 /********************************************************************************************** 二维母函数的模板大致如下: int c1[maxn][maxe],c2[maxn][mare]; int a[num]; 第一步:简单初始化 memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); 第二步:使计算有循环区间,就是有值可以相加,相加零毕竟无意义。 for(i=0;i<=maxe;++i)//inf为其中的限制条件 c1[i]=1; 第三步:对整个表达式进行逐个两两计算。 for(i=2;i<=num-1;++i)//n-1个表达式,因为第一个与第二个合成的结果记为新的第一个表达式 { for(j=0;j<=n;++j)//对所求的n个表达式之内的值进行计算,j表示前面j个表达式的结果中的第j项 { for(k=0;k+j<=n;k+=a[i]) { for(l=0;l+k/a[i]<=maxe;l++) c2[j+k][l+k/a[i]]+=c1[j][l]; } } for(j=0;j<=n;++j) { for(k=0;k<=maxe;++k) { c1[j][k]=c[j][k]; c2[j][k]=0; } } } 第四步:最后n的组成情况为: for(i=0;i<=maxe;++i) sum+=c1[n][i]; printf("%d\n",sum); 使用情况:可以组分的情况有多种,另外设立一个数组,主要的变化是在k的循环进行。 **********************************************************************************/ #include<stdio.h> #include<string.h> int c1[252][102],c2[252][102]; int a[6]={0,1,5,10,25,50}; int main() { int n; while(~scanf("%d",&n)) { if(n==0) { printf("1\n"); continue; } int sum=0; memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); int i,j,k,l; for(i=0;i<=100;++i) { c1[i][i]=1;//////////////////////// } for(i=2;i<=5;++i) { for(j=0;j<=n;++j) { for(k=0;k+j<=n;k+=a[i]) { for(l=0;l+k/a[i]<=100;l++) c2[j+k][l+k/a[i]]+=c1[j][l];/////////////// } } for(j=0;j<=n;++j) { for(k=0;k<=100;++k) { c1[j][k]=c2[j][k]; c2[j][k]=0; } } } for(i=0;i<=100;++i) sum+=c1[n][i]; printf("%d\n",sum); } return 0; }
//法二:竟然忘了一个最水的办法:直接暴力-_-|| #include<stdio.h> int main() { int i,j,k,l; int n; while(~scanf("%d",&n)) { if(!n) { printf("1\n"); continue; } int sum=0; for(i=n/50;i>=0;i--) { for(j=(n-i*50)/25;j>=0;j--) { for(k=(n-i*50-j*25)/10;k>=0;k--) { for(l=(n-i*50-j*25-k*10)/5;l>=0;l--) { if(i+j+k+l+n-i*50-j*25-k*10-l*5<=100) sum++; } } } } printf("%d\n",sum); } return 0; }
(简单母函数进阶版,暴力)hdu 2069 Coin Change
标签:母函数
原文地址:http://blog.csdn.net/ice_alone/article/details/44197495