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 }

 

你可能感兴趣的:(dp)