• 4-计算九位数以内各个位数字和为s的种类


    /*假设我们当前要求的是100以内各位数之和和等于s的数有多少个,可以想到就是10以内各位数之和等于s的数
    的个数再加上10到100内的各位数之和等于s的个数。令dp[i][j]就代表10的j次方内各位数之和等于i的数的个
    数,那么dp[i][j] = dp[i][j - 1] + (10的j-1次方到10的j次方内各位数之和等于i的数的个数)。那么后边这
    一部分怎么求呢?我们可以把j位数拆成j-1位数再加一位,要想让各位数之和等于i,那么加的这一位数只能是
    1到9中的任意一个数(不能是0的原因不用说了吧),假设我们加的数是1,那么我们剩下j-1位的和只能是i-1,
    也就是dp[i - 1][j - 1],如果加的数是2,那么我们剩下的j-1位的和就是dp[i - 2][j - 1],以此类推,状态
    转移方程就出来了,dp[i][j] = dp[i][j - 1] + dp[i - k][j - 1] ( 1 <= k <= 9)
    */
    #include <iostream>
    #include <cstdio>
    using namespace std;
    long long dp[90][10];

    int main(){
    /*    for(int i = 0; i <= 9; i++){
            dp[0][i] = 1;
            dp[i][1] = 1;
        }
        for(int j = 2; j <= 9; j++){
            for(int i = 1; i <= 81; i++){
                dp[i][j] = dp[i][j - 1];
                for(int k = 1; k <= 9 && k <= i; k++)
    //                dp[i][j] = dp[i][j - 1] + dp[i - k][j - 1];
                    dp[i][j] += dp[i - k][j - 1];
            }
        }
        dp[1][9]++; //1还多一种1000000000的情况
    */    
        int s;
        
    //    dp[0][9] = 0;    //加不加都能过,不科学,应该是不加的,s=0时应该就是一个
    //    while(cin >> s)   //There are multiple test cases. 有多个测试样例(看不懂英文就是苦逼)
    //    printf("%lld ", dp[s][9]);

        long long w[83]={1, 10, 45, 165, 495, 1287, 3003, 6435, 12870, 24310, 43749, 75501, 125565, 202005,
        315315, 478731, 708444, 1023660, 1446445, 2001285, 2714319, 3612231, 4720815, 6063255, 7658190,
         9517662, 11645073, 14033305, 16663185, 19502505, 22505751, 25614639, 28759500, 31861500, 34835625,
          37594305, 40051495, 42126975, 43750575, 44865975, 45433800, 45433800, 44865975, 43750575, 42126975,
           40051495, 37594305, 34835625, 31861500, 28759500, 25614639, 22505751, 19502505, 16663185, 14033305,
            11645073, 9517662, 7658190, 6063255, 4720815, 3612231, 2714319, 2001285, 1446445, 1023660, 708444,
             478731, 315315, 202005, 125565, 75501, 43749, 24310, 12870, 6435, 3003, 1287, 495, 165, 45, 9, 1};
    //    for(int i = 0; i <= 81; i++) 利用这个打表
    //        printf("%lld, ", dp[i][9]);
        while(~scanf("%d", &s))
            printf("%lld ", w[s]);
        return 0;
    }

  • 相关阅读:
    [转]跨语言通信方案比较
    C#三种定时器
    Java优化技巧
    websocket初探
    [转]远远走来一个绿茶婊
    赠与今年的大学毕业生-----------胡适
    HDU3068 回文串 Manacher算法
    OpenCV安装与配置
    tkinter事件机制
    哈夫曼压缩
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7384366.html
Copyright © 2020-2023  润新知