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 }