zoukankan      html  css  js  c++  java
  • 母函数写法

      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 }
  • 相关阅读:
    关于findViewById返回空指针的错误
    android客户端向服务器发送图片和文字,类似于发微博。能用json格式发送吗?
    nodejs 学习资料大全
    篇章三:[AngularJS] 使用AngularCSS動態載入CSS
    篇章二:[AngularJS] 使用AngularAMD動態載入Service
    篇章一:[AngularJS] 使用AngularAMD動態載入Controller
    Angular 资料大集合
    js-音乐播放器,播放|暂停|滑块的功能
    JS-以鼠标位置为中心的滑轮放大功能demo1
    使用 Electron 构建桌面应用(拖动控制篇)
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3587409.html
Copyright © 2011-2022 走看看