hdu 2069

题目大意:输入一个钱数,看能否用1、5、10、25、50这5种硬币来组成输入的钱数。如果能,则输出方案数。

解题思路:一开始看到题目的时候,很自然想到用母函数。后来认真看了一下题目,发现用母函数居然不会做(以下母函数的方法是参考别人的)。。。

后来就尝试着用暴力法解决。然后居然AC了。


代码如下:

暴力法(用c写不行。)

 

/*

 * 2069_2.cpp

 *

 *  Created on: 2013年8月9日

 *      Author: Administrator

 *      我爱天天,天天爱我

 */



#include <iostream>



using namespace std;



int main(){

	int n,a,b,c,d,e;



	while(cin>>n){

		int count = 0;

		for(a = 0 ; a <= n ; ++a){

			for(b = 0 ; 5*b <= n-a ; ++b){

				for(c= 0 ; 10*c <= n - a - 5*b ; ++c){

					for( d= 0 ; 25*d <= n - a - 5*b - 10*c;++d){

						e = n - a - 5*b - 10*c - 25*d;



						if(e % 50 == 0 && a + b + c + d + e/50 <= 100){

							count ++;

						}

					}

				}

			}

		}



		cout<<count<<endl;

	}



}




 

母函数法:

 

#include<iostream>

using namespace std;

	int c1[251][101],c2[251][101];

	int a[6]={0,1,5,10,25,50};

	int sum[251];

int main(){

	



	c1[0][0]=1;   

 /* 注意 这里的初始化替代了:

int n,a[5]={1,5,10,25,50},sum; 

    for(int i=0;i<=260;++i)

    for(int j=0;j<=101;++j) 

    {

        c1[i][j]=0;c2[i][j]=0;

    }

    for(int i=0;i<=100;++i)//用面值为1的硬币组成价值为i(不超过100) 

    {

            c1[i][i]=1;*/



        for(int i=1;i<=5;i++){

		for(int j=0;j<=250;j++){

			for(int k=0;k*a[i]+j<=250;k++){

				for(int t=0;k+t<=100;t++){//遍历c1的coin数量

					c2[k*a[i]+j][t+k]+=c1[j][t];

				}

			}

		}

		for(int i=0;i<251;i++){

			for(int j=0;j<101;j++){

				c1[i][j]=c2[i][j];

				c2[i][j]=0;

			}

		}

	}

	/*int n;

	while(cin>>n){

		int sum=0;

		for(int i=0;i<105;i++){

			sum+=c1[n][i];

		}

		cout<<sum<<endl;

	}

	*/

	 for ( int j = 0; j != 251; ++ j )

           {

                for ( int i = 0; i != 101; ++ i )

                {

                      sum[j] += c1[j][i] ;

                }

           }

           int N;

           while ( cin >> N )

           {

                  

                  cout << sum[N] << endl;

           }

return 0;

}


 



 

你可能感兴趣的:(HDU)