Milliard Vasya’s Function URAL 1353(DP)
题目链接:https://cn.vjudge.net/contest/190727#problem/F
题目大意:求1-1e9之间的数中,各数位和为s的数的个数。
input:1 output:10
题目分析:dp[i][j] i表示第i位,j表示和为j;
对于当前这位,就可以放0,个数为dp[i - 1][j] ;可以放1,个数为dp[i - 1][j - 1]; 可以放2,个数为dp[i - 1][j - 2]; …..最大可以放的是min(9, j);直接跑dp即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500;
const int inf = 0x3f3f3f3f;
int dp[maxn][maxn], n;
int main()
{
int s;
cin >> s;
for(int i = 1; i <= 9; i++ ) dp[i][0] = 1;
for(int i = 1; i <= 9; i++) {
for(int j = 1; j <= 81; j++) {
for(int k = 0; k <= min(j, 9); k++) {
dp[i][j] += dp[i - 1][j - k] ;
}
}
}
dp[9][1] += 1;
printf("%d\n", dp[9][s]);
}