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

B.找單詞——(HDU 2082 普通型母函數)

編輯:C++入門知識

B.找單詞——(HDU 2082 普通型母函數)


找單詞

Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5721Accepted Submission(s): 4026


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

解題思路:

 

這是一個母函數的題,因為ACM與CMA認為是同一個單詞,因為這是組合問題,所以這不是指數型的母函數。在下一篇博客中會詳細介紹一下關於普通型母函數的知識點。這裡就簡單的說幾句,就拿第一個例子來說吧,就拿第一個例子來說吧,我們可以這樣想因為A, B, C的字母只有一個而且他們的價值還不相同,A=1,B=2,C=3,所以我們可以組成的單詞可以是(1+X) * (1+X^2) * (1+X^3) == 1 + X + X^2 + 2*X^3 + X^4 + X^5 + X^6,所以價值不 小於50的就是 <=50的 X 的系數加起來, But沒有X^0前面的系數不需要,因為沒有字母就不是單詞,想明白這個之後就是寫程序了, 請看我的代碼:

 

My Code:

 

#include 
using namespace std;

int c1[55];///每一次存的多項式中的數
int c2[55];///中間轉化變量
int arr[30];///輸入的價值數組

///初始化
void Init()
{
    for(int i=0; i<55; i++)
    {
        c1[i] = 0;
        c2[i] = 0;
    }
}

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        Init();
        for(int i=1; i<=26; i++)
            cin>>arr[i];
        c1[0] = 1;
        for(int i=1; i<=26; i++)///一共26個多項式相乘
        {
            for(int j=0; j<=50; j++)///指數最多是50
            {
                for(int k=0; k<=arr[i] && k*i+j<=50; k++)///循環次數,k*i也是指數,就是多項式相乘
                {
                    c2[k*i+j] += c1[j];
                }
            }
            for(int j=0; j<=50; j++)///c1才是系數
            {
                c1[j] = c2[j];
                c2[j] = 0;
            }
        }
        int ret = 0;
        for(int i=1; i<=50; i++)///指數是0的不算單詞
            ret += c1[i];
        cout<

 

 

 

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