回溯,主要是去重
#include<stdio.h>
int f,n,k,s[12],a[12];
void dfs(int p,int l)
{int i;
if(!l)
{printf("%d",a[0]);
for(f=i=1;i<k;i++)
printf("+%d",a[i]);
puts("");
return;
}
if(p>=n||l<0)
return;
for(i=p;i<n;i++)
if(i==p||s[i]!=s[i-1])//去重
{a[k++]=s[i];
dfs(i+1,l-s[i]);
k--;
}
}
int main()
{int i,m;
while(scanf("%d%d",&m,&n),m)
{
f=k=0;
for(i=0;i<n;i++)
scanf("%d",&s[i]);
printf("Sums of %d:/n",m);
dfs(0,m);
if(!f)
puts("NONE");
}
}
本文介绍了一个使用回溯算法实现组合求和的C语言程序实例。该程序通过递归调用和去重策略来寻找所有可能的数的组合,使得这些数的总和等于给定的目标值。文章详细展示了如何避免重复组合,适用于初学者理解回溯算法的基本原理。
793

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



