Divisibility
Description Consider an arbitrary sequence of integers. One can place + or - operators between integers in the sequence, thus deriving different arithmetical expressions that evaluate to different values. Let us, for example, take the sequence: 17, 5, -21, 15. There are eight possible expressions: 17 + 5 + -21 + 15 = 16 Input The first line of the input file contains two integers, N and K (1 <= N <= 10000, 2 <= K <= 100) separated by a space. Output Write to the output file the word "Divisible" if given sequence of integers is divisible by K or "Not divisible" if it's not. Sample Input 4 717 5 -21 15 Sample Output Divisible
|
题意:给出N个数通过在其中添加+-号问是否能计算出k的倍数
dp[i][j]代表前i个数余数为j是否存在
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int MAX=10010;
int dp[MAX][110];
int num[MAX];
int main()
{
int n,m,k,i,j;
while(scanf("%d%d",&n,&k)!=EOF){
memset(dp,0,sizeof(dp));
for(i=0;i<n;++i){
scanf("%d",&num[i]);
if(num[i]<0){
num[i]*=-1;
}
num[i]%=k;
}
dp[0][num[0]]=1;
for(i=1;i<n;++i){
for(j=0;j<k;++j){
if(dp[i-1][j]){
dp[i][(j+num[i])%k]=1;
dp[i][(k+j-num[i])%k]=1;
}
}
}
if(dp[n-1][0])
printf("Divisible\n");
else
printf("Not divisible\n");
}
return 0;
}