hdu 2566 暴力枚举+母函数

来源:互联网 发布:antlr sql解析 github 编辑:程序博客网 时间:2024/06/06 01:26

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

题解:

n-i-j可能会出现负数,wrong answer了一次。还是太菜了。
暴力枚举即可。第二种母函数后贴上。

代码:

#include <bits/stdc++.h>using namespace std;/*注意n-i-j可能出现负数*/int main(){    int T;    cin>>T;    while(T--)    {       int n,m;       cin>>n>>m;       int ans=0;       for(int i=0;i<=m/5;i++)        for(int j=0;j<=m/2;j++)       {           int k = n-i-j;           if((i*5+j*2+k)==m&&k>=0)             ans++;       }       cout<<ans<<endl;    }    return 0;}

母函数法

#include <bits/stdc++.h>using namespace std;int c1[1010][1010];int c2[1010][1010];int val[4]={0,1,2,5};int main(){       memset(c1,0,sizeof(c1));       memset(c2,0,sizeof(c2));       int i,j,k,l;       for(i=0;i<=1000;i++)       {           c1[i][i]=1;       }       for(i=2;i<=3;i++)       {           for(j=0;j<=1000;j++)            for(k=0;k+j<=1000;k+=val[i])             for(l=0;l+k/val[i]<=1000;l++)              c2[k+j][l+k/val[i]]+=c1[j][l];           for(k=0;k<=1000;k++)            for(l=0;l<=1000;l++)           {               c1[k][l]=c2[k][l];               c2[k][l]=0;           }       }    int T;    cin>>T;    int n,m;    while(T--)    {       cin>>n>>m;       cout<<c1[m][n]<<endl;    }    return 0;}