1. 程式人生 > >hdu_2082_找單詞_201404271536

hdu_2082_找單詞_201404271536

找單詞

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


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 Source  
#include <stdio.h>
#include 
<string.h> int c1[60],c2[60]; int main() { int T; scanf("%d",&T); while(T--) { int s[30]; int i,j,k,sum=0; memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=1;i<=26;i++) scanf("%d",&s[i]); for(i=0;i<=s[1
];i++) c1[i]=1; for(i=2;i<=26;i++) { for(j=0;j<=50;j++) for(k=0;k<=s[i]&&(j+k*i<=50);k++) { c2[j+k*i]+=c1[j]; } for(j=0;j<=50;j++) { c1[j]=c2[j];
//printf("%d ",c2[j]); c2[j]=0; } //printf("\n"); } for(i=1;i<=50;i++) sum+=c1[i]; printf("%d\n",sum); } return 0; } //母函式

參考程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 const int N=50;
 8 
 9 int c1[N+10],c2[N+10],num[30];
10 
11 int main(){
12 
13     //freopen("input.txt","r",stdin);
14 
15     int t;
16     scanf("%d",&t);
17     while(t--){
18         memset(c1,0,sizeof(c1));    //c1[ ]儲存當前得到的多項式各項係數
19         memset(c2,0,sizeof(c2));    //c2[ ]儲存每次計算時的臨時結果
20         for(int i=1;i<=26;i++)
21             scanf("%d",&num[i]);
22         c1[0]=1;                //相當於用X^0去乘以後面的多項式 
23         for(int i=1;i<=26;i++){     //要乘以26個多項式
24             for(int j=0;j<=N;j++)   //c1的各項的指數
25                 for(int k=0;k<=num[i] && j+k*i<=N;k++)  //k*i表示被乘多項式各項的指數,(X^0*i + X^1*i + X^2*i + ……)
26                     c2[j+k*i]+=c1[j];       //指數相加得j+k*i,加多少隻取決於c1[j]的係數,因為被乘多項式的各項係數均為1
27             for(int j=0;j<=N;j++){
28                 c1[j]=c2[j];
29                 c2[j]=0;
30             }
31         }
32         int ans=0;
33         for(int i=1;i<=N;i++)
34             ans+=c1[i];
35         printf("%d\n",ans);
36     }
37     return 0;
38 }