uva 10036 Problem C: Divisibility
题意:能否在一个整数序列的每相邻的两项之间添加一个加减号,使得最终结果能被一个给定整数K<=100整除。
dp[i][j]表示第i个数取余k为j的布尔值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 20000 5 using namespace std; 6 7 int t; 8 int n,k; 9 int a[maxn]; 10 bool flag; 11 bool dp[maxn][110]; 12 13 int main() 14 { 15 scanf("%d",&t); 16 while(t--) 17 { 18 memset(dp,false,sizeof(dp)); 19 scanf("%d%d",&n,&k); 20 for(int i=0; i<n; i++) 21 { 22 scanf("%d",&a[i]); 23 } 24 dp[0][abs(a[0])%k]=true; 25 for(int i=1; i<n; i++) 26 { 27 for(int j=0; j<k; j++) 28 { 29 if(dp[i-1][j]) 30 { 31 dp[i][(j+k+abs(a[i]))%k]=true; 32 dp[i][((j+k-abs(a[i]))%k+k)%k]=true; 33 } 34 } 35 } 36 if(dp[n-1][0]) printf("Divisible\n"); 37 else printf("Not divisible\n"); 38 } 39 return 0; 40 }