这次是整除问题。
刚读完题时,相信很多人会和我一样,脑中闪现的词语一定是——“搜索”。确实,所谓“搜索是万能的”,本题用搜索确实可以做,但“搜索也是万万不能的”,当你提交后,一个残酷的事实摆在了你面前——超时!此时的你一定欲哭无泪。既然搜索超时,就要转变方法。经过仔细考虑,另一种方法估计已经在你脑中成型了——DP(Dynamic Programming),没错,动态规划。
对于这个题你需要将两正一反的三条线与n*k的二维数组结合起来,利用二维数组存储取余的可能性,一行一行地向下推进。
当你的思维量达到极致时,本题的代码就会极简单。相信它也已经在你手下自然而然的成型了吧。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n,k;
int num[10000+2][100+2],A[10000+2];
int main() {
scanf("%d %d",&n,&k);
for(int i=0;i<n;++i)scanf("%d",A+i);
num[0][A[0]%k]=1;
for(int i=0;i<n;++i){
for(int j=0;j<k;++j){
if(num[i][j]){
num[i+1][(j+A[i+1])%k]=1;
if((j-A[i+1]%k)<0)num[i+1][(j-A[i+1])%k+k]=1;
else num[i+1][(j-A[i+1])%k]=1;
}
}
}
if(num[n-1][0])printf("Divisible\n");
else printf("Not divisible\n");
return 0;
}