程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [ACM] hdu 2082 找單詞 (母函數)

[ACM] hdu 2082 找單詞 (母函數)

編輯:C++入門知識

Problem Description

假設有x1個字母A, x2個字母B,..... x26個字母Z,同時假設字母A的價值為1,字母B的價值為2,..... 字母Z的價值為26。那麼,對於給定的字母,可以找到多少價值<=50的單詞呢?單詞的價值就是組成一個單詞的所有字母的價值之和,比如,單詞ACM的價值是1+3+14=18,單詞HDU的價值是8+4+21=33。(組成的單詞與排列順序無關,比如ACM與CMA認為是同一個單詞)。


Input

輸入首先是一個整數N,代表測試實例的個數。
然後包括N行數據,每行包括26個<=20的整數x1,x2,.....x26.


Output

對於每個測試實例,請輸出能找到的總價值<=50的單詞數,每個實例的輸出占一行。


Sample Input

2
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9 2 6 2 10 2 2 5 6 1 0 2 7 0 2 2 7 5 10 6 10 2 10 6 1 9


Sample Output

7
379297


解題思路:

母函數的經典使用。

代碼:

#include 
#include 
using namespace std;
int num[27];
int c[60],temp[60];

int main()
{
    int t;cin>>t;
    while(t--)
    {
        memset(c,0,sizeof(c));
        memset(temp,0,sizeof(temp));
        for(int i=1;i<=26;i++)
            cin>>num[i];
        for(int i=0;i<=num[1];i++)//對第一個式子初始化
        {
            c[i]=1;
        }
        for(int i=2;i<=26;i++)
        {
            if(num[i]!=0)
            {
               for(int j=0;j<=50;j++)//上一個式子裡面的系數
                for(int k=0;k<=num[i]&&k*i+j<=50;k++)//k代表的是個數,一共k個i
                {
                   temp[k*i+j]+=c[j];
                }
                for(int j=0;j<=50;j++)
                {
                    c[j]=temp[j];
                    temp[j]=0;
                }
            }
        }
        int count=0;
        for(int i=1;i<=50;i++)
        {
            count+=c[i];
        }
        cout<

另一種寫法:

#include 
#include 
using namespace std;
int num[27];
int c[60],temp[60];

int main()
{
    int t;cin>>t;
    while(t--)
    {
        memset(c,0,sizeof(c));
        memset(temp,0,sizeof(temp));
        for(int i=1;i<=26;i++)
            cin>>num[i];
        c[0]=1;//程序入口
        for(int i=1;i<=26;i++)
        {
            if(num[i]!=0)
            {
               for(int j=0;j<=50;j++)//第i個式子裡面的系數
                for(int k=0;k<=num[i]&&k*i+j<=50;k++)//k代表的是個數,一共k個i
                {
                   temp[k*i+j]+=c[j];
                }
                for(int j=0;j<=50;j++)
                {
                    c[j]=temp[j];
                    temp[j]=0;
                }
            }
        }
        int count=0;
        for(int i=1;i<=50;i++)
        {
            count+=c[i];
        }
        cout<



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved