最大扇入数怎么判断_3531:判断整除(DP)

该博客探讨了一道算法题,涉及动态规划和整除概念。题目要求在给定正整数序列前添加符号(+或-)并计算和,判断结果是否能被特定整数k整除。由于数据规模较大,不适合使用枚举法,作者提出了利用动态规划的状态转移方程来解决,通过数组f[i][j]记录序列前i个数模k的余数是否为j。文章还讨论了如何处理负数余数和数组下标的技巧。
摘要由CSDN通过智能技术生成

0ea21119ca1b4c1fc4926623050d491e.png

【题目描述】3531:判断整除 By HackPluto

描述

一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和。比如序列:1、2、4共有8种可能的序列:

(+1) + (+2) + (+4) = 7

(+1) + (+2) + (-4) = -1

(+1) + (-2) + (+4) = 3

(+1) + (-2) + (-4) = -5

(-1) + (+2) + (+4) = 5

(-1) + (+2) + (-4) = -3

(-1) + (-2) + (+4) = 1

(-1) + (-2) + (-4) = -7

所有结果中至少有一个可被整数k整除,我们则称此正整数序列可被k整除。例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。注意:0、-3、-6、-9……都可以认为是3的倍数。

输入

输入的第一行包含两个数:N(2 < N < 10000)和k(2 < k< 100),其中N代表一共有N个数,k代表被除数。第二行给出序列中的N个整数,这些整数的取值范围都0到10000之间(可能重复)。

输出

如果此正整数序列可被k整除,则输出YES,否则输出NO。(注意:都是大写字母)

0f931777926fd8574298a39eac920739.png

一、题意分析

本题的输入为两部分,一个是N,一个是K,N代表着有N个数,K代表要被整除的数,本题的意思就是输入N个正整数(划重点,输入的只有正数)然后在每个数前面加+ 或— 判断最后的和能不能被K整除。因为这个题是在动态规划的章节的,所以在思考的时候就在往动态规划的地方考虑,如果我不知道这个是在考动态规划,我可能会使用枚举法将每一种情况都穷举出来然后判断,但是看一下这个题的数据规模,N <= 10000,也就是说我要枚举2^10000次 ,这显然是超时的。所以对于这个题来说,动态规划可能是最好的方法了。

二、算法说明

既然已经知道了是使用动态规划,那么对于动态规划来说最重要的就是写出状态转移方程了,那这个题怎么写状态转移方程呢,我们可以使用一个数组 f[i][j] 来代表序列前i个数模k的余数是不是j,是的话这一元素的值为1否则为0。显然 f[i][j] 中的j就是序列中第一个元素模k的值还有第一个元素的负数模k的值,这个题中如何处理负数是一个重点,因为负数的余数也是负数,怎么用下标存呢,这里介绍一个技巧,先将这个负数余数加上k再取模,为什么呢,我们发现对于一串数求和算模k的余数我们用这个方法求的余数是一样的

三、数据结构

数组

四、代码与调试

9526a2ce17d48e4ea1bd6ac8e6b0cc54.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值