//题意大概为:1~1000000000之间,各位数字之和等于给定s的数的个数
每行给出一个数s(1 ≤ s ≤ 81),求出1~10^9内各位数之和与s相等的数的个数。
//dp[i][j]+=dp[i-1][j-k];(k>=0 && k<j && k<9),(j<=i*9)
//也可以递归打表
//今天拿出来重新想想又觉得不太对劲!我认为看k!=0 因为k=0的情况是前面的i-1总数的累加,
//如果k可以==0,那么后面就不应该加上sum在求一次总合!!,现在的理解是这个程序是对的!!!
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<string> const int INF = 0x3f3f3f3f; using namespace std; int n; int dp[15][82]={0}; int main() { for(int i=1; i<=9; i++) dp[1][i]=1; for(int i=2; i<=9; i++) for(int j=1; j<=i*9; j++) for(int k=0; k<j && k<=9; k++) dp[i][j]+=dp[i-1][j-k]; while(cin>>n) { printf("%d\n",dp[9][n]); } return 0; }//以后如果想其他的方法,在来修改 #include<iostream> #include<algorithm> #include<cstdio> using namespace std; int dp[10][82]; int main() { int n; for(int i=1; i<=9; i++) dp[1][i]=1; for(int i=1; i<=9; i++) for(int j=1; j<=9*i; j++) for(int k=0; k<=9 && k<j; k++) dp[i][j]+=dp[i-1][j-k]; while(cin>>n) { if(n==1) { printf("10\n"); continue; } else { int sum=0; for(int i=1; i<=9; i++) { sum+=dp[i][n]; } printf("%d\n",sum); } } return 0; }//ac