#include <iostream>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include<cstdlib>
#include<vector>
//最后要输出的路径
int* path = new int[105]{ 0 };
//全局标志,是否存在子集
int flag = false;
void recursion(int curIndex, int curSum, int count, int* nums, int n, int target) {
//如果已经存在了,直接返回
if (flag) {
return;
}
//如果当前和等于目标和
if (curSum == target) {
//标记
flag = true;
//返回
return;
}
//如果越界了,返回
if (curIndex == n) {
return;
}
//当前要填的位置是count,当前遍历的位置是curIndex
//做选择
path[count] = nums[curIndex];
//选择下一个
count++;
//做下一位的选择
recursion(curIndex + 1, curSum + nums[curIndex], count, nums, n, target);
//回溯
count--;
//再做下一位的选择
recursion(curIndex + 1, curSum, count, nums, n, target);
}
int main()
{
int n;
cin >> n;
int target;
cin >> target;
int* nums = new int[n];
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
recursion(0, 0, 0, nums, n, target);
//如果找到了,那么就在path里找到路径输出
if (flag) {
int i = 0;
//当和仍不为0
while (target != 0) {
//输出当前path位置的元素
cout << path[i] << ' ';
//减
target -= path[i];
//下一个
i++;
}
}
else {
//没找到
cout << "No Solution";
}
return 0;
}
8603 子集和问题(优先做)
于 2022-11-11 10:45:23 首次发布