母函数写法

  1 import java.awt.Point;
  2 import java.io.BufferedInputStream;
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import java.util.Map;
  6 import java.util.Scanner;
  7 
  8 public class Main {
  9 
 10     static int T=0,n=0,knum=0,sum=0,count=0;
 11 //    public static void  dfs(List<Point> list,int k)
 12 //    {
 13 //        if(sum==n)
 14 //        {
 15 //            count++;
 16 //            return;
 17 //        }
 18 //        else if(sum<n)
 19 //        {
 20 //            if(k>=knum)
 21 //                return;
 22 //            Point point=list.get(k);
 23 //            for(int i=0;i<=point.y;i++)
 24 //            {
 25 //                sum=sum+i*point.x;
 26 //                dfs(list,k+1);
 27 //                sum=sum-i*point.x;
 28 //            }
 29 //        }
 30 //        else
 31 //            return;
 32 //    }
 33     
 34     public static void  dfs(List<Point> list,int k,int mysum)
 35     {    
 36         if(mysum>50)
 37             return;
 38         if(k==list.size())
 39         {
 40             if(mysum!=0)
 41                 count++;
 42             return;
 43         }
 44         Point point=list.get(k);
 45         for(int i=0;i<=point.y;i++)
 46         {
 47             //sum+=point.x*i;
 48             int mynewsum=mysum+point.x*i;
 49             if(mynewsum<=50)
 50                 dfs(list,k+1,mynewsum);
 51             //sum-=point.x*i;
 52         }
 53     }
 54     
 55     public static void main(String[] args) {
 56         Scanner cin=new Scanner(System.in);
 57         List<Point> list=new ArrayList<Point>();
 58         int a, b;
 59         int num[]=new int[27];
 60         while(cin.hasNextInt())
 61         {
 62             T = cin.nextInt();
 63             while(0!=T--)
 64             {
 65 //                list.clear();
 66                 int c1[]=new int[51],c2[]=new int[51];
 67                 for(int i=0;i<51;i++)
 68                 {
 69                     c1[i]=0;
 70                     c2[i]=0;
 71                 }
 72                 c1[0]=1;
 73                 for(int i=1;i<=26;i++)    //i代表第几项式
 74                 {
 75                     a=cin.nextInt();
 76                     for(int j=50;j>=0;j--)  //j代表 被乘的 第几项
 77                     {
 78                         if(c1[j]!=0)
 79                             for(int k=1;k<=a;k++)    //k代表 i上的叠加,就是第i项式上的叠加数
 80                             {
 81                                 if(j+k*i<51)        //此后 j+k*i就是  第j项被乘了 k*i
 82                                     c1[j+k*i]+=c1[j];
 83                             }
 84                     }
 85                 }
 86                 sum=0;
 87                 for(int i=1;i<51;i++)
 88                     sum+=c1[i];
 89                 System.out.println(sum);
 90                 
 91                 count=0;
 92 //                dfs(list,0,0);
 93               // dfs(num,0,0);
 94 
 95                // System.out.println(count);
 96             }
 97         }
 98     }
 99 
100 
101 }

hdu2082 母函数写法

 

 

 

 

普遍写法如下:

 1 例2 如同例1 但是每种纸币个数不限 ,现求表示不同数值的方案数。
 2     由于是无限  ,母函数表示为 f(x)=(1+1*x+1*x^2+1*x^3....)(1+1*x^2+1*x^4+1*x^6....)(1+1*x^3+1*x^6+1*x^9....)(1+1*x^4+1*x^8+1*x^12....)
 3   此时继续分析面值为4的情况:4=1+1+1+1=1+3=1+2+1=2+2   有5种情况。
 4 
 5 代码2:
 6    void Function2(int n)   //纸币可以用无数次   n张纸币
 7 {
 8 int a[100],sum=0;   //存贮币值
 9    for(int i=0;i<n;i++)
10    {
11   cout<<"输入第"<<i+1<<"个纸币的面额:"<<endl;
12   cin>>a[i];
13   sum+=a[i];      //由于无数个纸币,最大值也是无限大,此处最大值假设为sum
14    }
15    for(i = 0; i <=sum; i++)  
16         {  
17             c1[i] = 0;  
18             c2[i] = 0;  
19         }
20    for(i=0;i<=sum;i=i++)   
21   c1[i]=1;
22    for(i=2;i<=n;i++)
23    {
24   for(int j=0;j<=sum;j++)
25   for(int k=0;k+j<sum;k=k+a[i-1])
26   {
27   c2[j+k]+=c1[j];
28   }
29 for(j=0;j<=sum;j++)
30 {
31 c1[j]=c2[j];
32 c2[j]=0;
33 }
34 
35    }
36 
37    for(i=1;i<=sum;i++)  
38   cout<<i<<"---"<<c1[i]<<endl;   //输出每个面值对应的方案数
39   
40 }

 

posted on 2014-03-07 23:32  wf110  阅读(340)  评论(0编辑  收藏  举报