NY 269 VF

题目

求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).

 代码如下:

 
#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;
}
        
View Code
原文地址:https://www.cnblogs.com/Houheshuai/p/3660058.html