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;

}

 

你可能感兴趣的:(HDU)