现在的位置: 首页 > 综合 > 正文

hdu 2566 统计硬币

2018年01月21日 ⁄ 综合 ⁄ 共 893字 ⁄ 字号 评论关闭

统计硬币

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3844    Accepted Submission(s): 2693

Problem Description
假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。
 

Input
输入数据第一行有一个正整数T,表示有T组测试数据;
接下来的T行,每行有两个数n,m,n和m的含义同上。
 

Output
对于每组测试数据,请输出可能的组合方式数;
每组输出占一行。
 

Sample Input
2 3 5 4 8
 

Sample Output
1 2
/*题解:(母函数)      刚开始用一位数组做的 ,发现可以求出来由1分、2分、5分组成的总面值为m分的硬币组成方式,但是n没什么用了。     然后开始用二维数组,第一位存组成方式,第二位存n枚硬币的情况。
注:此题可以直接枚举,形如 百钱白鸡     */
#include<cstdio>
#include<cstring>
int c1[1010][1010],c2[1010][1010];
int main()
{
    int T,i,j,k,h,n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&n,&m);
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(i=0; i<=n; i++)
        c1[i][i]=1;
        for(i=2; i<=5; i+=3)
        {
            for(j=0; j<=m; j++)
            {             
                for(k=0; k*i+j<=m&&k<=n; k++) //计算钱数 
                {       
                    for(h=0; h+k<=n; h++)     //计算个数 
                    c2[k*i+j][h+k]+=c1[j][h]; 
                }
            }
            for(j=0; j<=m; j++)
            for(h=0; h<=n; h++)
            {
                c1[j][h]=c2[j][h];
                c2[j][h]=0;
            }
        }
        printf("%d\n",c1[m][n]);
    }
    return 0;
}
 

抱歉!评论已关闭.