标签:nyoj
1
10
题意:输入一个数s,求1-10^9中,每个数的各位数字之和为s的数有几个
dp[i][j]表示前 j 位数字之和为 i 的情况的数量
当 i 〉1 时,假设第 j 位为 k ,那么前 j - 1 的和就是 i - k;
由此得出状态转移方程dp[i][j]=dp[i][j]+dp[i-k][j-1];
01.
#include<iostream>
02.
using
namespace
std;
03.
int
dp[85][15];
04.
int
main()
05.
{
06.
for
(
int
i=0;i<10;i++)
07.
dp[0][i]=1;
08.
for
(
int
i=1;i<82;i++)
09.
for
(
int
j=1;j<10;j++)
//前j位之和为i
10.
for
(
int
k=0;k<10&&i-k>=0;k++)
//第j位为k,使前j-1位为i-k
11.
if
(dp[i-k][j-1])
//如果前面的数字能组合成i-k
12.
dp[i][j]+=dp[i-k][j-1];
13.
int
s;
14.
while
(cin>>s)
15.
{
16.
if
(s==1)
17.
cout<<10<<endl;
18.
else
19.
cout<<dp[s][9]<<endl;
20.
}
21.
return
0;
22.
}
标签:nyoj
原文地址:http://blog.csdn.net/justesss/article/details/37660323