1.算法基本思想
该问题的解空间树是一棵子集树。设解向量x=(x1,x2,…,xn),这里是求所有满足目标条件的解,所以一旦搜索到叶子结点(即i>n),如果相应的子集和为W,则输出x解向量。
2.主要数据结构及其作用
一维整型数组S[n]存储集合S 中的数
一维数组x[n]存放子集和的解
3.测试用例
4.实验结果截图
测试用例1
测试用例2
测试用例3
5.代码实现
#include<iostream>
#include<cstring>
using namespace std;
int n,M,a[10000],b[10000],d[10000],i,sum=0;//a保存当前输入的数组,b算出的子集
bool pd;
void fout(int dep)
{
int j;
cout<<"一种可能的子集为:"<<endl;
for (j=1; j<=dep; ++j)
cout<<d[j]<<" ";
cout<<endl;
return;
}
void dfs(int dep)
{
int r;
if (pd==1) return;
for (r=1; r<=n; ++r)
if (!b[r]&&M-a[r]>=0)
{
if (pd==1) return;
M-=a[r];//用c减去每个数,其实就是几个数之和等于c
d[dep]=a[r];//d是记录数组
b[r]=1;
if (M==0) //如果找到一组解,直接输出,完成任务
{
if (pd==0)
fout(dep);
pd=1;
return;
}
else dfs(dep+1);
if (pd==1) return;
M+=a[r];//回溯一步
b[r]=0;
}
}
int main()
{
cout<<"请输入正整数M和数组元素个数n:"<<endl;
cin>>M>>n;
cout<<"请输入数组元素:"<<endl;
for (i=1; i<=n; ++i)
{
cin>>a[i];
sum+=a[i];
}
if (sum<M)
{
cout<<"无解!"<<endl;
return 0;
}
memset(d,0,sizeof(d));
memset(b,0,sizeof(b));
pd=0;
dfs(1);
if (!pd) cout<<"无解!"<<endl;;
return 0;
}
喜欢就点个赞叭~