nyoj VF (DP)

dp[i][j]表示第i位之前和等于j的数

得公式dp[i][j] = dp[i][j] + dp[i-1][j-k];

k为当前位上的数

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<map>
 9 #include<iomanip>
10 #include<climits>
11 #include<string.h>
12 #include<cmath>
13 #include<stdlib.h>
14 #include<vector>
15 #include<stack>
16 #include<set>
17 #define INF 1e7
18 #define MAXN 100010
19 #define maxn 1000010
20 #define Mod 1000007
21 #define N 1010
22 using namespace std;
23 typedef long long LL;
24 
25 int dp[11][111];
26 int s, i, j;
27 
28 void run()
29 {
30     int ans = 0;
31     if (s != 1)
32     {
33         for (i = 1; i<10; i++)
34             ans += dp[i][s];
35         cout << ans << endl;
36     }
37     else
38         cout << 10 << endl;
39 }
40 
41 int main()
42 {
43     int i, j;
44     for (i = 1; i<10; i++)
45         dp[1][i] = 1;
46     for (i = 1; i <= 9; i++)
47         for (j = 1; j <= 9 * i; j++)
48             for (int k = 0; k <= 9 && k <= j; k++)
49                 dp[i][j] += dp[i - 1][j - k];
50     while (cin >> s)
51         run();
52     //system("pause");
53     return 0;
54 }
原文地址:https://www.cnblogs.com/usedrosee/p/4356838.html