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;
}
本文介绍了一个使用动态规划(DP)方法解决数位之和问题的算法,具体涉及了如何通过递推公式计算给定数字范围内所有可能的数位之和。详细解释了算法的核心思想、步骤实现及代码实现细节。

被折叠的 条评论
为什么被折叠?



