pku 1745 dp 滚动数组
#include <iostream>
using namespace std;
const int INF = 200;
unsigned char dp[110][2];
int sq[10010];
int main()
{
int N, K;
while (scanf("%d %d", &N, &K) != EOF)
{
int i, j;
for (i = 0; i < N; ++i)
{
scanf("%d", &sq[i]);
}
for (i = 0; i < K; ++i)
{
dp[i][1] = INF;
dp[i][0] = INF;
}
dp[(sq[0]%K+K)%K][0] = (sq[0]%K+K)%K;
for (i = 1; i < N; ++i)
{
for (j = 0; j < K; ++j)
{
if (dp[j][0] != INF)
{
int p = ((dp[j][0]+sq[i])%K+K)%K;
int q = ((dp[j][0]-sq[i])%K+K)%K;
dp[p][1] = p;
dp[q][1] = q;
}
}
for (j = 0; j < K; ++j)
{
dp[j][0] = dp[j][1];
dp[j][1] = INF;
}
}
if (dp[0][0] == 0)
{
printf("Divisible\n");
}
else
{
printf("Not divisible\n");
}
}
return 0;
}
浙公网安备 33010602011771号