链接:点击打开链接
题意:给出N个数,这N个数中每个数必须用1次,做加减运算,求最后结果是否能整除K
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <stdlib.h>
using namespace std;
int dp[10005][105],s[10005]; //dp[i][j]代表前i个数做运算后余数是否等于j
int main(){
int n,k,i,j;
while(scanf("%d%d",&n,&k)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&s[i]);
s[i]=abs(s[i])%k;
}
memset(dp,0,sizeof(dp));
dp[0][s[0]]=1;
for(i=1;i<n;i++)
for(j=k-1;j>=0;j--){
if(dp[i-1][j]){
dp[i][(j+s[i])%k]=1;
dp[i][((j-s[i])%k+k)%k]=1; //加上k防止产生负值
}
}
// for(i=0;i<n;i++){
// for(j=0;j<k;j++)
// cout<<dp[i][j]<<" ";
// cout<<endl;
// }
if(dp[n-1][0])
printf("Divisible\n");
else
printf("Not divisible\n");
}
return 0;
}