【一本通】判断整除(简单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
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
      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)
踩方块题解
踩方块原题传送门

你可能感兴趣的:(动态规划dp,杂题,考试)