ural 1353. Milliard Vasya's Function

本文详细解释了Vasya’s Functions(VF)的概念,重点在于计算1到N之间的整数中,各位数字之和等于给定值S的数的数量。通过简单的动态规划(DP)方法解决此问题,包括状态转移方程的推导,并提供了代码实现。了解如何通过位数和数字之和的限制来优化计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目看不懂,,,

简直了


其实开始都是废话,重要的就一句 

 Vasya’s Functions (VF) are rather simple: the value of the Nth VF in the point S is an amount of integers from 1 to N that have the sum of digits S.


就是求1到N中各位数字之和为S的数的个数

只想看题意的童鞋现在可以ctrl+w了


---------------下面是思路的分界线-------------

就是一个简单的dp

可以由N的位数来划分状态


以下是状态转移方程 

dp[i][j]+=dp[i-k][j-1];

其中j是N的位数,i是N的各位数之和,k的取值是0~9

dp[s][9]即为所求

(好像没什么好说的了。。还是直接上代码吧

(哦对了,题中给的N是10^9 所以dp[1][9]要+1          (想一想,为什么


#include<cstdio>
#include<cstring>
using namespace std;

int dp[100][11];

int main(){
    int s;
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(int j=1;j<=9;j++)
        for(int k=0;k<=9;k++)
            for(int i=k;i<=81;i++)
                dp[i][j]+=dp[i-k][j-1];
    dp[1][9]++;
    while(~scanf("%d",&s)){
        printf("%d\n",dp[s][9]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值