子集和问题-回溯算法-C++

本文介绍了一种使用回溯法解决子集和问题的方法,通过C++代码实现,旨在寻找一个集合的子集,其元素之和等于给定的目标值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:子集和问题的一个实例为<s,t>,其中,s={x1,x2,…xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在s的一个子集s1,使得s1中元素的和等于c。
本题使用回溯法解决

#include<iostream>
#include<stdlib.h>
using namespace std;

#define max 100 
int a[max],b[max];
int sum = 0, m, n;//m为目标值,n为集合的大小
void Solve(int k)
{
	if (k == n)
	{
		if (sum == m)//相等时输出一个解
		{
			cout << "其中一个子集为:";
			for (int i = 0; i < n; i++)
				if (b[i] != 0)
					cout << b[i] << " ";
			cout << endl;
			return;
		}
	}
	else
	{
		sum += a[k];
		b[k] = a[k];
		Solve(k + 1);
		sum -= a[k];//回溯时先还原
		b[k] = 0;
		Solve(k + 1);
	}
}
int main()
{
	memset(b, 0, sizeof(b));
	cout << "请输入集合S元素个数n:";
	cin >> n;
	cout << "请输入目标值:";
	cin >> m;
	cout << "请输入集合S元素:";
	for (int i = 0; i < n; i++)
		cin >> a[i];
	Solve(0);
	system("PAUSE");
	return 0;
}

示例输入输出:
在这里插入图片描述
学习中,欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值