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 }
原文地址:https://www.cnblogs.com/yaling/p/3027158.html