01背包__DP(POJ1745)
题意:n个整数中间填上+或者-,运算结果能否被k整除。1<=n<=10000, 2<=k<=100
代码:
#include<iostream> #include<cstdio> #include<cstring> #define N 10005 bool dp[N][100]; int a[N]; int main() { int n,k,i,j; memset(dp,false,sizeof(dp)); dp[0][0]=true; scanf("%d%d",&n,&k); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } for(i=1;i<=n;i++) { for(j=0;j<k;j++) { if(dp[i-1][j]) { dp[i][(j+a[i]%k+k)%k]=true; dp[i][(j-a[i]%k+k)%k]=true; } } } if(dp[n][0]) printf("Divisible\n"); else printf("Not divisible\n"); return 0; }