原创内容,如转载请注明出处
题意:给定一个值和一个数组,求数组中任意个数字的和等于给定值的所有序列
输入:
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 }
只为训练自己,时刻锤炼一个程序员最基本的技能!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!