void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出几个数字,然后然你给中间加上+/-号,得到的结果是否有能被所给得数m整出 

很明显的动态规划问题,构造一个数组a[i][j]表示前i个数字组成的数是否能被j整除,能的话就是true

然后写出转移方程, for i=1 to num  for j=1 to m  if(a[i][j]){a[i+1][(j+num[i+1])%m]=true; a[i+1][abs(j-num[i+1])%m]=true;}

另外在处理输入的数据时候,可以保留输入数据%m之后的余数即可,并且都转换成绝对值保存

1 #include <stdio.h>
2 #include <memory.h>
3 #include <stdlib.h>
4 #include <math.h>
5  int main()
6 {
7 int t,n,k,num[10001],c,m;
8 bool a[10001][101];
9 while(scanf("%d",&t)!=EOF){
10 while(t--)
11 {
12 c=0;
13 //memset(num,-1,sizeof(num));
14   memset(a,false,sizeof(a));
15 scanf("%d%d",&n,&k);
16 for(int i=1;i<=n;i++)
17 {
18 scanf("%d",&m);
19
20 if(m<0)m=0-m;
21 m=m%k;
22 if(m==0)
23 continue;
24 else num[c++]=m;
25 }
26 if(c==0)
27 printf("Divisible\n");
28 else{
29 a[0][num[0]]=1;
30 for(int i=0;i<c-1;i++)
31 for(int j=0;j<k;j++)
32 {
33 if(a[i][j]){
34 a[i+1][(j+num[i+1])%k]=true;
35 a[i+1][abs(j-num[i+1])%k]=true;}
36 }
37 if(a[c-1][0]) printf("Divisible\n");
38 else printf("Not divisible\n");
39
40 }
41 if(t!=0)printf("\n");
42 }
43
44 }
45 return 0;}
posted on 2011-04-19 00:26  void-man  阅读(142)  评论(0)    收藏  举报