练习38

来源:互联网 发布:游戏编程语言 编辑:程序博客网 时间:2024/04/29 07:56
 
  1. /**********************************************************************************
  2.   38. 有一集合中有 N 个元素,每个元素均为自然数。给定一个 total (假设每个
  3.  元素值均小于total),求满足条件的所有子集,子集中各元素之和应等于total。
  4.   **********************************************************************************/
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. int n;//元素个数
  8. int *Num;//保存所有元素
  9. int total;//和
  10. int *uses;//各个元素的使用情况
  11. //显示子集
  12. void PrintSubMuster()
  13. {
  14.     int i;
  15.     int flag = 0;
  16.     printf("{ ");
  17.     for(i=0; i<n; i++)
  18.     {
  19.         if(uses[i])
  20.         {
  21.             if(flag)
  22.                 printf(" , ");
  23.             else flag = !flag;
  24.             printf("%d",Num[i]);
  25.         }
  26.     }
  27.     printf(" }/n");
  28. }
  29. //增加一个元素到集合
  30. void AddOne(int k,int sum)
  31. {
  32.     if(k == n)
  33.     {
  34.         if(sum == total)
  35.         {
  36.             PrintSubMuster();
  37.         }       
  38.     }
  39.     else 
  40.     {
  41.         uses[k] = 1;//含有该元素
  42.         sum += Num[k];
  43.         AddOne(k+1,sum);
  44.         uses[k] = 0;//不含该元素
  45.         sum -= Num[k];
  46.         AddOne(k+1,sum);
  47.     }
  48. }
  49. void main()
  50. {
  51.     int i;
  52.     //输入元素个数
  53.     printf("请输入元素的个数n的值:");
  54.     scanf("%d",&n);
  55.     Num = (int*)malloc(n*sizeof(int));
  56.     uses = (int*)malloc(n*sizeof(int));
  57.     printf("请输入%d个自然数:/n",n);
  58.     for(i=0; i<n; i++)
  59.     {
  60.         scanf("%d",&Num[i]);//输入元素
  61.         uses[i] = 0;//初始化为未使用
  62.     }
  63.     //输入和值
  64.     printf("请输入total的值:");
  65.     scanf("%d",&total);
  66.     //求解
  67.     AddOne(0,0);
  68.     //释放空间
  69.     free(Num);
  70.     free(uses);
  71. }