Hdu 2566 统计硬币

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2566

看完这题,这不禁让我想起了hdu的2069。

两者同样是求有多少种方法,没有要求说明具体的组合方式,因此可以采用生成函数的方法解题。

可以采用一个二维数组,同时控制硬币的总数量及总价值,其数组某一元素的值为在此数量和总价下的组合方式。

因此可以采用先打表的方式。

 

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
const int MAXN = 700;
int c1[MAXN][MAXN], c2[MAXN][MAXN];
int coin[3] = {1,2,5};

int main()
{
    int i,j,k,l;
    int loop;
    int N,M;
    memset( c1, 0, sizeof(c1) );
    memset( c2, 0, sizeof(c2) );
    for( i=0;i<MAXN;i++ )
        c1[i][i] = 1;
    for( i=1;i<3;i++ ) // the value of coins
    {
        for( j=0;j<MAXN;j++ ) // the num of former coins
        {
            for( l=0;l<MAXN;l++ ) // the value of former coins
            {
                for( loop=0;loop*coin[i] + l<MAXN && j+loop<MAXN;loop++ )
                {
                    c2[ j+loop ][ loop*coin[i]+l ] += c1[j][l];
                }
            }
        }
        for( j=0;j<MAXN;j++ )
        {
            for( k=0;k<MAXN;k++ )
            {
                c1[j][k] = c2[j][k];
                c2[j][k] = 0;
            }
        }
    }
    int T;
    cin >> T;
    while( T-- )
    {
        cin >> N >> M;
        cout << c1[N][M] << endl;
    }
    return 0;
}

 

posted @ 2014-11-19 23:43  Emerald  阅读(186)  评论(0编辑  收藏  举报