📄 5-1.cpp
字号:
#include <iostream>
using namespace std;
const int n = 10;
int time = 0;
int s[n] = {2,3,5,4,1,6,7,8,9,10};
int c = 10;
int sum = 0;
int is_not[n] = {0}; //确定集合中数字是否在子集合中,值为0则在,值为1则不在,初始化为0
void backtrack(int [], int, int);
void main()
{
int i = 0;
backtrack(s, n, i);
if(time==0)
cout<<"No Solution!"<<endl;
}
void backtrack(int *p , int n, int i) //回溯法搜索子集和
{
if(sum == c) //如果当前子集和与c相等,则输出该子集和中的整数
{
for(int j=0; j<n; ++j)
{
if(is_not[j]==1)
{
cout<<s[j]<<" ";
}
}
cout<<endl;
time++;
}
else
{
if(sum + p[i] <= c)
{
for(int k=1; k>=0; --k)
{
if(k==1) //将当前节点值加入到子集和中,并递归调用backtrack,将i的值自加
{
sum += s[i];
is_not[i]=1;
}
else //不将当前节点值加入到子集和中,并递归调用backtrack,将i的值自加
{
sum -= s[i];
is_not[i]=0;
}
backtrack(p, n, i+1);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -