求数组中若干个元素之和等于给定值

这个问题的基础版本是:在数组中找两个元素,使其之和等于某个给定值。解法简单:将数组排序后,用两个指针分别位于数组首与数组尾,然后计算两个指针所指元素的和,若大于给定的元素,则尾部的指针向前移动;若小于给定的元素,则首部的指针向后移动。

但该问题提升后,成为了子集和问题,这是一个NP问题。在leetcode上还有升级版本的问题:求给定数组中四个元素之和等于给定元素的所有元素的子集。该问题,只能用暴力搜索,加点启发式的暴力搜索,在数量到两个数之后用上述的两数之和的方法。

看了一个作者的博客里面的例子,理解了在数组中找若干个元素之和等于给定值的方法。作者博客见:点击打开链接

举一个简单的适合自己理解的例子:

数组为: [1,2,3,4,5,6]。找给定值 12 。元素个数不限定,只要找到的元素之和=12即可

初始化栈:

【1】 栈中元素和为 1 < 12。压入 1 的下一个元素 2

【1,2】 栈中元素和为 3 < 12 。压入 2 的下一个元素 3

【1,2,3】 栈中元素和为 6 < 12 。压入 3 的下一个元素 4

【1,2,3,4】 栈中元素和为 10 < 12 。压入 4 的下一个元素 5

【1,2,3,4,5】 栈中元素和为 15 > 12。则将栈顶元素 5 出栈,并将新的栈顶元素 4 扩大为位于其后的值

【1,2,3,5】 栈中元素和为 11 < 12。压入 5 的下一个元素 6

【1,2,3,5,6】 栈中元素和为 17 > 12。则将栈顶元素 6 出栈,并将新的栈顶元素 5 扩大为位于其后的值

【1,2,3,6】 栈中元素和为 12 = 12。则结束程序,栈中的元素即为找到的子集


实现代码如下:

vector<int> addSum(vector<int> & v,int dest_sum)
{
	typedef int Value;
	typedef int Loc;
	std::sort(v.begin(), v.end());
	stack<pair<Value,Loc>> sta;
	int loc = 0;
	int init_loc = 0;
	int sum = v[loc];
	sta.push({ v[loc],loc});
	++loc; 
	while (sum != dest_sum)
	{
		if (loc < v.size() && sum + v[loc] <= dest_sum)
		{
			sum += v[loc];
			sta.push({ v[loc], loc });
			++loc;
		}
		else
		{
			if (!sta.empty())
			{
				auto v = sta.top();
				sum -= v.first;
				sta.pop();
				loc = v.second + 1;
			}
			else
			{
				sum = 0;
				loc = ++init_loc;
			}
		}
	}
	
	vector<int> res;
	while (!sta.empty())
	{
		res.push_back(sta.top().first);
		sta.pop();
	}
	return res;
}


  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二级上机题库,有每个题的题目和 答案的地方,直接把题目第一句话复制下来 查询一定能查到 第一套 1. 程序填空 程序通过定义学生结构体数组,存储了若干个学生的学号、姓名和三门课的成绩。函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大排序)。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 第一处 struct student t; 第二处 for(i=0;i<n-1;i++) 第三处 if(strcmp(a[i].name,a[j].name)>0) 2 程序修改 给定程序MODI1.C中函数fun的功能是:在p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上;并将该字符前的原字符向上顺序移动。 /**found**/ q=p+i; /**found**/ while(q>p) 3程序设计 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写了函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数返回。 int fun(STREC *a,STREC *b,int l,int h) {int i,j=0; for(i=0;i<N;i++) if((a[i].s>=1&&a[i].s<=h) b[j++]=a[i]; return j; } 第二套 1. 程序填空 给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序连接。函数fun的功能是:删除链表中数据域相同的结点,使之只保留一个。 第一处 free(q); 第二处 q=p->next; 第三处 q=q->next; 2. 程序修改 给定程序MODI1.C中函数fun的功能是:用选择法对数组中的n各元素按从小到大的顺序进行排序。 /**found**/ p=j; /**found**/ p=i; 3. 程序设计 请编写一个fun函数,它的功能是:出1到m之间(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。 void fun(int m,int *a,int *n) { int i; *n=0; for(i=7;i<=m;i++) if((i%7==0)||(i==0)) a[(*n)++]=i; }
VBScript 语言参考 特性信息 字母顺序关健字列表 常数 错误 事件 函数 方法 对象 运算符 属性 语句 欢迎使用 VBScript 语言参考 通过对信息进行分组,可以使您方便地研究 Visual Basic 脚本的各个主题。 可以在“字母顺序关键字列表”中找到 VBScript 语言的所有主题。如果只需要查看某个主题(例如对象),则有对该主题进行详细说明的章节可供查阅。 如何操作呢?单击左边任意一个标题,即可显示该标题所包含的项目列表。从该列表中选择要查看的主题。打开所选主题之后,就能够很容易地链接到其他相关章节。 请尽情浏览 JScript 语言参考的各个部分,您会发现 VBScript 语言有多么丰富。 特性 说明 版本信息 按主机应用排序的 VBScript 版本列表和按版本排序的特性列表. VBScript 特性 VBScript 最新特性列表 未包含在 VBScript 中的 VBA 特性 VBScript 最新特性列表:未包含在 VBScript 中的应用程序编辑。 未包含在 VBA 中的 VBScript 特性 未包含在 Visual Basic 中的 VBScript 特性列表:应用程序编辑。 Microsoft Scripting 运行时特性 VBScript 中最新的 Scripting 运行时特性列表。 语言元素 说明 Abs 函数 返回数的绝对。 加法运算符 (+) 数相加。 And 运算符 执行个表达式的逻辑连接。 Array 函数 返回含一数组的 变体 。 Asc 函数 返回字符串首字母的 ANSI 字符代码。 赋运算符 (=) 给变量或属性赋。 Atn 函数 返回数的反正切。 Call 语句 将控制移交 Sub 或 Function 过程。 CBool 函数 返回已被转换为 Boolean 子类型的变体的表达式。 CByte 函数 返回已被转换为字节子类型的变体的表达式。 CCur 函数 返回已被转换为货币子类型的变体的表达式。 CDate 函数 返回已被转换为日期子类型的变体的表达式。 CDbl 函数 返回已被转换为双精度子类型的变体的表达式。 Chr 函数 返回指定 ANSI 字符码的字符。 CInt 函数 返回已被转换为整数子类型的变体的表达式。 Class 对象 提供对已创建的类的事件的访问。 Class 语句 声明类名 Clear 方法 清除 Err 对象的所有属性设置。 CLng 函数 返回已被转换为 Long 子类型的变体的表达式。 颜色常数 颜色常数列表。 比较常数 用于比较运算的常数列表。 连接运算符 (&) 强制个表达式的字符串连接。 Const 语句 声明用于字母的常数。 Cos 函数 返回角度的余弦。 CreateObject 函数 创建并返回对“自动”对象的引用。 CSng 函数 返回已被转换为单精度子类型的变体的表达式。 CStr 函数 返回已被转换为字符串子类型的变体的表达式。 日期和时间常数 在日期和时间运算中用来定义星期几和其他常数的常数列表。 日期格式常数 用于日期和时间格式的常数列表。 Date 函数 返回当前系统日期。 DateAdd 函数 返回加上了指定的时间间隔的日期。 DateDiff 函数 返回个日期之间的间隔。 DatePart 函数 返回给定日期 的指定部分。 DateSerial 函数 返回指定年月日的 日期子类型的变体 。 DateValue 函数 返回日期子类型的变体 。 Day 函数 返回日期,取范围为 1 至 31。 Description 属性 返回或者设置说明某个错误的字符串。 Dictionary 对象 存储数据键、项目对的对象。 Dim 语句 声明变量并分配存储空间。 除法运算符 (/) 数相除并以浮点数格式返回商。 Do...Loop 语句 当条件为 True 或者当条件变为 True 时,重复一语句块。 Empty 表示尚未初始化的变量。 Eqv 运算符 使个表达式相等。 Erase 语句 重新初始化固定数组的元素并重新分配动态数组的存储空间。 Err 对象 含有关于运行时错误的信息。 Eval 函数 计算并返回表达式的。 Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 ExecuteGlobal 语句 执行一个或多个在全局脚本名字空间中所指定的语句。 Exit 语句 退出 Do...Loop、For...Next
VBSCRIPT中文手册,这里的信息可以帮你很方便地浏览 Visual Basic 脚本的许多不同部分。 你可以找到在按字母排序的关键字列表中列出的 VBScript 语言的所有部分。如果你只想调阅某一部分,例如“对象”,那么语言的每一部分都有它自己更严密的章节。 如何查找呢?单击左边的某个标题,即显示该部分中包含的项目列表。从这张列表中选择要查看的主题。当这个主题打开后,再链接到其他相关的部分就简单多了。 好了,让我们试一试,体会体会!学习几个语句,研究几种方法,或者熟悉几个函数。你就能学会如何巧妙地运用 VBScript 语言,充分发挥 VBScript 语言的强大功能。 特性 说明 VBScript 特性 VBScript 最新特性列表 未包含在 VBScript 中的 VBA 特性 VBScript 最新特性列表:未包含在 VBScript 中的应用程序编辑。 未包含在 VBA 中的 VBScript 特性 未包含在 Visual Basic 中的 VBScript 特性列表:应用程序编辑。 Microsoft Scripting 运行时特性 VBScript 中最新的 Scripting 运行时特性列表。 语言元素 说明 Abs 函数 返回数的绝对。 加法运算符 (+) 数相加。 And 运算符 执行个表达式的逻辑连接。 Array 函数 返回含一数组的 变体 。 Asc 函数 返回字符串首字母的 ANSI 字符代码。 赋运算符 (=) 给变量或属性赋。 Atn 函数 返回数的反正切。 调用语句 将控制移交 Sub 或 Function 过程。 CBool 函数 返回已被转换为 Boolean 子类型的变体的表达式。 CByte 函数 返回已被转换为字节子类型的变体的表达式。 CCur 函数 返回已被转换为货币子类型的变体的表达式。 CDate 函数 返回已被转换为日期子类型的变体的表达式。 CDbl 函数 返回已被转换为双精度子类型的变体的表达式。 Chr 函数 返回指定 ANSI 字符码的字符。 CInt 函数 返回已被转换为整数子类型的变体的表达式。 Class 对象 提供对已创建的类的事件的访问。 Class 语句 声明类名 Clear 方法 清除 Err 对象的所有属性设置。 CLng 函数 返回已被转换为 Long 子类型的变体的表达式。 颜色常数 颜色常数列表。 比较常数 用于比较运算的常数列表。 连接运算符 (&) 强制个表达式的字符串连接。 Const 语句 声明用于字母的常数。 Cos 函数 返回角度的余弦。 CreateObject 函数 创建并返回对“自动”对象的引用。 CSng 函数 返回已被转换为单精度子类型的变体的表达式。 CStr 函数 返回已被转换为字符串子类型的变体的表达式。 日期和时间常数 在日期和时间运算中用来定义星期几和其他常数的常数列表。 日期格式常数 用于日期和时间格式的常数列表。 Date 函数 返回当前系统日期。 DateAdd 函数 返回加上了指定的时间间隔的日期。 DateDiff 函数 返回个日期之间的间隔。 DatePart 函数 返回给定日期 的指定部分。 DateSerial 函数 返回指定年月日的 日期子类型的变体 。 DateValue 函数 返回日期子类型的变体 。 Day 函数 返回日期,取范围为 1 至 31。 Description 属性 返回或者设置说明某个错误的字符串。 Dictionary 对象 存储数据键、项目对的对象。 Dim 语句 声明变量并分配存储空间。 除法运算符 (/) 数相除并以浮点数格式返回商。 Do...Loop 语句 当条件为 True 或者当条件变为 True 时,重复一语句块。 Empty 表示尚未初始化的变量。 Eqv 运算符 使个表达式相等。 Erase 语句 重新初始化固定数组的元素并重新分配动态数组的存储空间。 Err 对象 含有关于运行时错误的信息。 Eval 函数 计算并返回表达式的。 Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 Exit 语句 退出 Do...Loop、For...Next、 Function 或 Sub 代码块。 Exp 函数 返回 e (自然对数的底)的多少次方。 自乘运算符 (^) 指数函数,幂为自变量。 False 关键字,其为零。 FileSystemObject 对象 提供对计算机文件系统的访问。 Filter 函数 根据指定的筛

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值