原创内容,如转载请注明出处
题意:给定一个值和一个数组,求数组中任意个数字的和等于给定值的所有序列
输入:
10
1 2 7 5 6 8 10
输出
1 2 7
2 8
10
分析:此题首先对数组排序,再采用递归和回溯的方法,对于每次回溯,是否采用 i 位置上的数字作为加数,是一个回溯的关键点
1 #include <cstdio> 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 #include <cstdlib> 6 #include <algorithm> 7 8 using namespace std; 9 10 //递归和回溯 11 void CalculateSumCore(vector<int> &src, int sum, int start, vector<int> &resultIndex, vector<int> &resultValue) { 12 if (sum == 0) { 13 cout << "下标为:"; 14 for (auto s : resultIndex) 15 cout << s << " "; 16 cout << endl; 17 cout << "下标对应值:"; 18 for (auto s : resultValue) 19 cout << s << "+"; 20 cout << endl; 21 } 22 else if (sum >= src[start] && start < src.size()) { 23 resultIndex.push_back(start); 24 resultValue.push_back(src[start]); 25 CalculateSumCore(src, sum - src[start], start + 1, resultIndex, resultValue); 26 //注意入“栈”才需要出“栈”即是回溯的过程 27 resultIndex.pop_back(); 28 resultValue.pop_back(); 29 CalculateSumCore(src, sum, start + 1, resultIndex, resultValue); 30 } 31 } 32 33 void CalculateSum(vector<int> &src, int sum) { 34 sort(src.begin(), src.end()); 35 if (sum < 0 && src.empty()) 36 return; 37 vector<int> resultIndex; //存储结果值的下标 38 vector<int> resultValue; //存储结果值 39 CalculateSumCore(src, sum, 0, resultIndex, resultValue); 40 } 41 42 int main() 43 { 44 vector<int> src{ 1,2,6,3,5,7,10 }; 45 int sum; 46 cin >> sum; 47 CalculateSum(src, sum); 48 system("pause"); 49 return 0; 50 }