uva 10036

10036 - Divisibility

额..直接复制不过来,只好叙述一下了...
t组样例,n个数(1~10000),k(2~100)是要取余的数,然后给出n个数
第一个数前不能加正负号,其他的数前面可以加正负号,然后问这些正负号任意加,所有的情况中是否有能对k取余得0的情况。
若有输出:Di...否则Not...

 

感觉好水的dp,可是就是学不会呀。。。。

好烦恼.

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #include <iostream>
 6 #include <algorithm>
 7 #include <climits>
 8 #include <queue>
 9 #define ll long long
10 #define INF  0x3f3f3f3f
11 
12 using namespace std;
13 int dp[100100][105];
14 int main()
15 {
16     int t;
17     cin>>t;
18     while(t--)
19     {
20         int n,k,a;
21         cin>>n>>k>>a;
22         memset(dp,0,sizeof(dp));
23         dp[0][(a%k+k)%k] = 1;//dp[i][j]代表加到第i位余数为j
24         for(int i = 1; i < n; i++)
25         {
26             scanf("%d",&a);
27             a = abs(a)%k;
28             for(int j = 0; j < k; j++)
29             {
30                 if(dp[i-1][j])
31                     dp[i][(j+a)%k] = dp[i][(j - a+k)%k] = 1;
32             }
33         }
34         if(dp[n-1][0] == 1)
35             printf("Divisible\n");
36         else
37             printf("Not divisible\n");
38     }
39     return 0;
40 }

 

posted on 2015-08-20 14:08  鱼泪儿  阅读(180)  评论(0编辑  收藏  举报

导航