大意:问你从1到10^9之内所有位数相加为S的数有多少
我们定义dp[i][j]表示一共i位的数的和为j,那么可以得到状态转移方程dp[i][j] = dp[i-1][j] + dp[i-1][j-1] + ...dp[i-1][j-9]当然满足j-9 >= 0 因为考虑的是当前状态与原来状态的改变,把状态看做是一个整体,要插入的只是一个元素,dp[i-1][j]表示往入0,其他的意思就是插入k,考虑当s = 1时,要加1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[10][85];
int main()
{
int S;
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++) {
dp[i][j] = dp[i-1][j];
for(int k = 1; k <= 9 && k <= j ;k++){
dp[i][j] += dp[i-1][j-k];
}
}
}
while(~scanf("%d",&S)){
int ans = 0;
if(S == 1) {printf("10\n"); continue;}
for(int i = 1; i <= 9;i++)
ans += dp[i][S];
printf("%d\n",ans);
}
return 0;
}