【一本通】判断整除(简单dp)

一个给定的正整数序列,在每个数之前都插入 + 号或 - 号后计算它们的和。
比如序列: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的倍数。

输入样例
3 2
1 2 4
输出样例
NO

/*
f[i][j]:前i个数到达余数是j的情况能不能达到。
如何处理负数:f[i-1][(k+j-a[i]%k)%k]
负数当做正数处理,因为后面的数一起变符号,可以得到相同的状态(处理了负数可以整除的情况) 
*/

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[10001],f[10001][101];

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    f[0][0]=true;
    for(int i=1;i<=n;i++)
     for(int j=0;j<k;j++)
      f[i][j]=f[i][j]||f[i-1][(k+j-a[i]%k)%k]||f[i-1][(j+a[i]%k)%k];
    if(f[n][0]) printf("YES\n");
    else printf("NO\n");
    return 0;
}

另附一道踩方块的题解链接(同样是我想不到的dp)
踩方块题解
踩方块原题传送门

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值