题目大意:
输入一个1到81(9*9)的数字s,求在1到109有多少个数字的数位和等于s。
解题思路:
我们很容易知道一位数字等于s的个数。要使一个i位的数字数位和等于s,可以通过一个i-1位的数字后面加上0~9(如果s<9就是0~s)。于是很容易得出方程
dp[i][j]=dp[i-1][j-0]+dp[i-2][j-1]+……+dp[i-9][j-9];其中i表示i位的数字,j表示s。dp[i][j]表示一个i位数字数位和为j的方案数。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int s,dp[10][90]; memset(dp,0,sizeof(dp)); for(int i=1;i<10;i++){ dp[1][i]=1; } for(int j=1;j<82;j++){ for(int i=2;i<=9;i++){ for(int k=0;k<=9&&k<j;k++){ dp[i][j]+=dp[i-1][j-k]; } } } while(~scanf("%d",&s)){ long long ans=0; for(int i=1;i<=9;i++){ ans+=dp[i][s]; } if(s==1){ cout<<ans+1<<endl; } else{ cout<<ans<<endl; } } return 0; }
timus.1353. Milliard Vasya's Function 动态规划
时间: 2024-11-05 15:52:28