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;
}

 

posted on 2009-07-22 20:33  ZAFU_VA  阅读(340)  评论(0)    收藏  举报

导航