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 }