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