ZOJ 1204 Additive equations

  1. 地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204
  2. 题意
  3.   按顺序输出相加等于in[]的所有组情况
  4. Sample Input
  5. 3
  6. 3 1 2 3
  7. 3 1 2 5
  8. 6 1 2 3 5 4 6
  9. Output for the Sample Input
  10. 1+2=3
  11. Cant find any equations.
  12. 1+2=3
  13. 1+3=4
  14. 1+4=5
  15. 1+5=6
  16. 2+3=5
  17. 2+4=6
  18. 1+2+3=6
  19. 解题思路
  20.  简单的DFS。因为时间有10s,所以我用了一个蠢办法,控制answer-算式的长度,从而实现按题要求输出。
  21. 代码
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. int comp(const void *a,const void *b)
  26. {
  27.     return *(int*)a-*(int*)b;
  28. }
  29. #define max 505
  30. int in[max];
  31. int vis[max];
  32. int n,flag;
  33. int all;
  34. int find(int sum)
  35. {
  36.     int x;
  37.     for(x=0;x<n;x++)
  38.         if(in[x]==sum)
  39.             return 1;
  40.     return 0;
  41. }
  42. void dfs(int x,int sum,int len)
  43. {
  44.     int i,a;
  45.     if(find(sum)&&len==all)
  46.     {
  47.         int ans[max];
  48.         int j=0;
  49.         for(a=0;a<max;a++)
  50.         {
  51.             if(vis[a]!=0)
  52.                 ans[j++]=a;
  53.         }
  54.         if(j>1)
  55.         {
  56.             for(a=0;a<j-1;a++)
  57.                 printf("%d+",in[ans[a]]);
  58.             printf("%d=%d\n",in[ans[a]],sum);
  59.             flag=1;
  60.         }
  61.     }
  62.     for(i=x;i<n;i++)
  63.     {
  64.         if(vis[i]==0&&(sum+in[i])<=in[n-1])
  65.         {
  66.             vis[i]=1;
  67.             dfs(i+1,sum+in[i],len+1);
  68.             vis[i]=0;
  69.         }
  70.     }
  71. }
  72. int main()
  73. {
  74.     int t,i;
  75.     scanf("%d",&t);
  76.     while(t--)
  77.     {
  78.         scanf("%d",&n);
  79.         for(i=0;i<n;i++)
  80.             scanf("%d",&in[i]);
  81.         qsort(in,n,sizeof(in[0]),comp);
  82.         flag=0;
  83.         for(all=1;all<=n;all++)
  84.         {
  85.             memset(vis,0,sizeof(vis));
  86.             dfs(0,0,0);
  87.         }
  88.         if(flag==1)
  89.         {
  90.             printf("\n");
  91.         }
  92.         else 
  93.             printf("Can't find any equations.\n\n");
  94.     }
  95.     return 0;
  96. }

你可能感兴趣的:(C++,ACM,ZOJ,DFS)