http://acm.nyist.net/JudgeOnline/problem.php?pid=269
题目的主要意思假设有一个数s (1<= s <= 81) 找出 10^9的所有的位数字之和是s的个数。
主要使用DP的方法解决,动态转移方程 dp[i][j] += dp[i-1][j-k] (0 <= k <= 9 && k < j)
#include <stdio.h>
int dp[10][82];
void func()
{
int i,j,k;
for(i = 1; i < 10; i++)
{
dp[1][i] = 1;
}
for(i = 2; i < 10; i++)
{
for(j = 1; j <= 9*i; j++)
{
for(k = 0; k <= 9&&k < j; k++)
{
dp[i][j] += dp[i-1][j-k];
}
}
}
}
int main()
{
int s,i;
func();
while(~scanf("%d",&s))
{
int count = 0;
if(s == 1)
{
printf("%d\n",10);
continue;
}
else
{
for(i = 1; i < 10; i++)
{
count += dp[i][s];
}
}
printf("%d\n",count);
}
return 0;
}