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 }