动态规划,可以把序列计算的所有过程中的得到的结果都%k,这样就可以大大缩小了空间与时间。
View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
bool f[2][205];
int main()
{
//freopen("t.txt", "r", stdin);
int n, k;
scanf("%d%d", &n, &k);
memset(f, 0, sizeof(f));
f[0][100] = true;
for (int i = 1; i <= n; i++)
{
int a;
scanf("%d", &a);
for (int j = 0; j <= 200; j++)
f[i & 1][j] = f[(i - 1) & 1][(j - 100 + a) % k + 100] || f[(i - 1) & 1][(j - 100 - a) % k + 100];
}
if (f[n & 1][100])
printf("Divisible\n");
else
printf("Not divisible\n");
return 0;
}