比较简单的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;
}