NYOJ 236 VF
状态迁移方程为:dp[i][j] += dp[i-1][j-k],dp[i][j]表示前i位数字的和为j,假设第i位数字为k,
则前i为数字之和则为dp[i-1][j-k];(0<=k<=j)
1 #include<iostream>
2 using namespace std;
3 int dp[11][82];
4 void fn()
5 {
6 int i,j,k;
7 for(i = 1; i < 10; ++i)
8 dp[1][i] = 1;
9 for(i = 1; i < 10; ++i)
10 for(j = 1; j <= 9*i; ++j)
11 for(k = 0; k < 10 && k <= j; ++k)
12 dp[i][j] += dp[i-1][j-k];
13 }
14 int main()
15 {
16 int i,n,ans;
17 fn();
18 while(cin>>n)
19 {
20 ans = 0;
21 if(n==1) ans = 1;
22 for(i = 1; i < 10; ++i)
23 ans += dp[i][n];
24 cout<<ans<<endl;
25 }
26 return 0;
27 }
2 using namespace std;
3 int dp[11][82];
4 void fn()
5 {
6 int i,j,k;
7 for(i = 1; i < 10; ++i)
8 dp[1][i] = 1;
9 for(i = 1; i < 10; ++i)
10 for(j = 1; j <= 9*i; ++j)
11 for(k = 0; k < 10 && k <= j; ++k)
12 dp[i][j] += dp[i-1][j-k];
13 }
14 int main()
15 {
16 int i,n,ans;
17 fn();
18 while(cin>>n)
19 {
20 ans = 0;
21 if(n==1) ans = 1;
22 for(i = 1; i < 10; ++i)
23 ans += dp[i][n];
24 cout<<ans<<endl;
25 }
26 return 0;
27 }