POJ 1745 Divisibility
题目大意
N个整数的序列(顺序固定),通过加或减的运算,结果能否被K整除
思路
用二维bool数组存余数情况 dp[N][K]
变量i :考察到第 i个数
变量j :第 j个余数的情况
dp[ i ][ j ]:前 i个数是否能运算出余数 j
AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N,K,i,j,t;
int num[10010];
bool dp[10010][110];
memset(dp,0,sizeof(dp));
scanf("%d%d",&N,&K);
for(i=0;i<N;i++){
scanf("%d",&t);
num[i]=abs(t)%K;
}
dp[0][num[0]]=1;
for(i=1;i<N;i++)
{
for(j=0;j<K;j++)//遍历余数0~K-1的情况
{
if(dp[i-1][j])//上一轮存在余数j的情况
{
t=abs(j+num[i])%K;
dp[i][t]=1;
t=abs(j-num[i])%K;
dp[i][t]=1;
}
}
}
if(dp[N-1][0])
printf("Divisible\n");
else
printf("Not divisible\n");
return 0;
}