标签: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位之和为i10.for(int k=0;k<10&&i-k>=0;k++)//第j位为k,使前j-1位为i-k11.if(dp[i-k][j-1])//如果前面的数字能组合成i-k12.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.else19.cout<<dp[s][9]<<endl; 20.}21.return 0;22.}标签:nyoj
原文地址:http://blog.csdn.net/justesss/article/details/37660323