题目
求1—1000000000之间的数,它的各位数字之和为 s。
dp[i][j]表示 i 位数,它的各位数之和为 j 的总个数。
这里假设第 i 位为 k,则前 i - 1 位的和应为 j - k 。
状态转移方程:dp[i][j]=dp[i][j]+dp[i-1][j-k] (0<=k<=j&&k<=9).
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<math.h> using namespace std; int dp[10][82]; void init() { for(int i = 1; i <= 9; i ++) dp[1][i] = 1; for(int i = 1; i <= 9; i ++) for(int j = 1; j <= 9 * i; j ++) for(int k = 0; k <= 9 && j - k >= 0; k ++) dp[i][j] += dp[i - 1][j - k]; } int main() { init(); int n; while(~scanf("%d", &n)) { if(n == 1) cout <<10 <<endl; else { int cnt = 0; for(int i = 1; i <= 9; i ++) cnt += dp[i][n]; cout <<cnt <<endl; } } return 0; }