zoukankan      html  css  js  c++  java
  • nyoj 269 VF

    VF

    时间限制:1000 ms  |  内存限制:65535 KB

    链接:NYOJ269

    原创在:点击打开链接

    题意:1~1000000000之间,各位数字之和等于给定s的数的个数。

    每行给出一个数s(1 ≤ s ≤ 81),求出1~10^9内各位数之和与s相等的数的个数。

    1、只有s=1时,10^9的系数才能为1,否则就大于10^9。
    所以和为1的要单一列出来。

    2、如果s!=1:定义状态dp[i][j]为前i位各位数之和为j的情况数量:对于前i位的数字之和最大为:9*i,即每一位数字都是9。

    i=1、只有一位的数字,因为s>=1,所以最低位只能是1-9 其中的一个数字。

    i>1、假设第i位放数字k(则k只能是0~9并且k<=s),若要使第前i位数字之和为j,那么前i-1位只能放j-k,由此得出动态转移方程:d[i]][j]=d[i][j]+d[i-1][j-k] (0<=k<=j&&k<=9)。

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int dp[10][82];
        memset(dp,0,sizeof(dp));
        int i,j,k;
        int n;
        for(i=1; i<10; i++)
            dp[1][i]=1;
        for(i=1; i<10; i++)
        {
            for(j=1; j<=i*9; j++)
            {
                for(k=0; k<=9&&k<=j; k++)
                    dp[i][j]=dp[i][j]+dp[i-1][j-k];
            }
        }
        while(~scanf("%d",&n))
        {
            if(n==1)  printf("10
    ");
            else
            {
                int ans=0;
                for(i=1; i<10; i++)
                    ans+=dp[i][n];
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
    


  • 相关阅读:
    信息安全系统设计基础学习总结第二周
    一维数组求和2
    求一维数组的最大子数组的和
    第三周学习进度
    构建之法阅读笔记二
    四则运算三
    学习进度第二周
    四则运算二
    测试第二次程序
    阅读计划
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7207968.html
Copyright © 2011-2022 走看看