- /**********************************************************************************
- 38. 有一集合中有 N 个元素,每个元素均为自然数。给定一个 total (假设每个
- 元素值均小于total),求满足条件的所有子集,子集中各元素之和应等于total。
- **********************************************************************************/
- #include <stdio.h>
- #include <malloc.h>
- int n;//元素个数
- int *Num;//保存所有元素
- int total;//和
- int *uses;//各个元素的使用情况
- //显示子集
- void PrintSubMuster()
- {
- int i;
- int flag = 0;
- printf("{ ");
- for(i=0; i<n; i++)
- {
- if(uses[i])
- {
- if(flag)
- printf(" , ");
- else flag = !flag;
- printf("%d",Num[i]);
- }
- }
- printf(" }/n");
- }
- //增加一个元素到集合
- void AddOne(int k,int sum)
- {
- if(k == n)
- {
- if(sum == total)
- {
- PrintSubMuster();
- }
- }
- else
- {
- uses[k] = 1;//含有该元素
- sum += Num[k];
- AddOne(k+1,sum);
- uses[k] = 0;//不含该元素
- sum -= Num[k];
- AddOne(k+1,sum);
- }
- }
- void main()
- {
- int i;
- //输入元素个数
- printf("请输入元素的个数n的值:");
- scanf("%d",&n);
- Num = (int*)malloc(n*sizeof(int));
- uses = (int*)malloc(n*sizeof(int));
- printf("请输入%d个自然数:/n",n);
- for(i=0; i<n; i++)
- {
- scanf("%d",&Num[i]);//输入元素
- uses[i] = 0;//初始化为未使用
- }
- //输入和值
- printf("请输入total的值:");
- scanf("%d",&total);
- //求解
- AddOne(0,0);
- //释放空间
- free(Num);
- free(uses);
- }
练习38
最新推荐文章于 2026-06-05 11:30:57 发布
本文介绍了一个经典的子集求和问题:给定一个包含N个自然数的集合和一个目标和total,寻找所有可能的子集,使得这些子集中的元素之和等于给定的目标值。通过递归的方法,实现了子集的枚举并输出了所有符合条件的子集。

257

被折叠的 条评论
为什么被折叠?



