首页 > 代码库 > uva 10036 Problem C: Divisibility

uva 10036 Problem C: Divisibility

题意:能否在一个整数序列的每相邻的两项之间添加一个加减号,使得最终结果能被一个给定整数K<=100整除。

dp[i][j]表示第i个数取余k为j的布尔值。

 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 }
View Code

 

uva 10036 Problem C: Divisibility