ACM PKU 1745 Divisibility http://acm.pku.edu.cn/JudgeOnline/problem?id=1745

比较简单的DP题,就用到一个滚动数组;

思路:此题只要求一个余数为0的情况就行了,所以数组不用开那么大,每次我都对当前输入的数据取余,然后再标记一下就可以了;所以数组范围在100之内就够了,这里需要注意的是负数的处理(计算机不识别负数的取余情况);

#include <iostream>
using namespace std;
int N, K, data;
int flag[101],flag1[101];

void DP_flag(int data, int K)
{
int i;
for (i = 0; i < K; i++)
{
   if (flag1[i] == 1)
   {
    flag[(i+data)%K] = 1;
      flag[(i-data+K)%K] = 1;      //处理负数数据;
   }
}
for(i = 0;i < K; i++)
           flag1[i] = 0;
}

void DP_flag1(int data, int K)
{
int i;
for (i = 0; i < K; i++)
{
   if (flag[i] == 1)
   {
    flag1[(i+data)%K] = 1;
      flag1[(i-data+K)%K] = 1;      //处理负数数据;     
   }
}
for(i = 0;i < K; i++)
           flag[i] = 0;
}

void output(int i)
{
if (i == 0 )
{
   if (flag[0] == 1)
   {
    cout<<"Divisible"<<endl;
   }
     else 
    if (flag[0] == 0)   
   cout<<"Not divisible"<<endl;
}
if (i == 1 )
{
   if (flag1[0] == 1)
   {
    cout<<"Divisible"<<endl;
   }
     else 
    if (flag1[0] == 0)   
   cout<<"Not divisible"<<endl;
}
}

int main ()
{
int i ;
cin >> N >> K;
memset(flag,0,sizeof(flag));
cin >> data;
if(data < 0)      //处理负数数据;
   {
    data = -data;
    data = K - (data%K);
   }
   else 
   data = data % K;

flag[data % K] = 1;

    for (i = 1; i < N; i++)
{
   cin >> data;
   if(data < 0)      //处理负数数据;
   {
    data = -data;
    data = K - (data%K);
   }
   else 
   data = data % K;
   if (i % 2 == 0)
    DP_flag(data,K);
   else 
    if (i % 2 == 1)
    DP_flag1(data,K);
}
    output((N-1) % 2);

return 0; 
}

posted on 2011-05-06 18:41  _Clarence  阅读(142)  评论(0编辑  收藏  举报

导航