标签:母函数
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