//问题陈述:给定N个数,和一个数M,判定是否可以从N个数中取出若干个数,使它们的和等于M。
//对于每一个集合里的数,都有加入和不加入,因此两次递归,剪枝就是发现即使我后面全部放入也不够就不用再搜索了
#include <stdio.h>
#include <string.h>
int a[1000];
int n;
void DFS(int ans,int step,int r,int x[1000])
{
int i,j,sum;
if (ans==n)
return;
if (a[ans]==r)
{
for (i=0;i<step;i++)
printf("%d ",x[i]);
printf("%d\n",a[ans]);
return;
}
sum=0;
for (i=ans;i<n;i++)
sum=sum+a[i];
if (sum<r)//剪枝,剩下的都加上也不够
return;
if (sum==r)
{
for (i=0;i<step;i++)
printf("%d ",x[i]);
for (i=ans;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return;
}
DFS(ans+1,step,r,x);
r=r-a[
子集和数
最新推荐文章于 2022-11-26 23:51:37 发布
该博客介绍了如何利用深度优先搜索(DFS)解决给定集合中是否存在子集和为特定数值的问题。通过递归实现,并采用剪枝策略优化搜索过程,避免无效路径。示例代码用C语言编写,包括输入集合元素、目标和,以及输出符合条件的子集。
摘要由CSDN通过智能技术生成