http://acm.timus.ru/problem.aspx?space=1&num=1353
输入一个数 s,求 1~109
中各位数之和等于s的数的个数。
思路:dp[i][j]表示前i位表示的数之和是j的个数。那么dp[i][j] = dp[i-1][ j-c ] (0 <= c <= 9)。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int dp[11][100],n;
memset(dp,0,sizeof(dp));
for(int i = 1; i <= 9; i++)
dp[1][i] = 1; //注意初始化
for(int i = 2; i <= 9; i++)
{
for(int j = 1; j <= 81; j++)
{
for(int k = 0; k <= 9; k++)
dp[i][j] += dp[i-1][j-k];
}
}
int ans;
while(~scanf("%d",&n))
{
if(n == 1)
printf("10\n");
else
{
ans = 0;
for(int i = 1; i <= 9; i++)
ans += dp[i][n];
printf("%d\n",ans);
}
}
return 0;
}