[恢]hdu 2082
2011-12-27 16:40:47
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2082
题意:中文。
mark:YY了一个dp。dp[i][j]表示前i个字符组成价值为j的种类数,有dp[i][j] = dp[i-1][j-k*i],k∈[0,a[i]]。a[i]是第i个字符的最大个数。
最后把dp[26]的所有值(0除外)加起来就ok了。
代码:
# include <stdio.h>
# include <string.h>
int dp[30][60] ;
int a[30] ;
int main ()
{
int T, i, j, k, ans ;
scanf ("%d", &T) ;
while (T--)
{
for (i = 1 ; i <= 26 ; i++)
scanf ("%d", &a[i]) ;
memset (dp, 0, sizeof(dp)) ;
dp[0][0] = 1 ;
for (i = 1 ; i <= 26 ; i++)
{
for (j = 0 ; j <= 50 ; j++)
{
dp[i][j] = 0 ;
for (k = 0 ; k <= a[i] && k*i <= j; k++)
dp[i][j] += dp[i-1][j-k*i] ;
}
}
for (i = 1, ans = 0 ; i <= 50 ; i++)
ans += dp[26][i] ;
printf ("%d\n", ans) ;
}
return 0 ;
}