【编程练习】寻找和为定值的多个数

简介: 2010 年中兴面试题 编程求解: 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来。 // 21 题递归方法 //copyright@ July && yansha //July、yansha,updated。

2010 年中兴面试题
编程求解:
输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,
使其和等于m ,要求将其中所有的可能组合列出来。

// 21 题递归方法
//copyright@ July && yansha
//July、yansha,updated。
#include<list>
#include<iostream>
using namespace std;
list<int>list1;
void find_factor(int sum, int n)
{
// 递归出口
if(n <= 0 || sum <= 0)
return;
// 输出找到的结果
if(sum == n)
{
// 反转list
list1.reverse();
for(list<int>::iterator iter = list1.begin(); iter != list1.end(); iter++)
cout << *iter << " + ";
cout << n << endl;
list1.reverse();
}
list1.push_front(n); //典型的01 背包问题
find_factor(sum-n, n-1); //放n,n-1 个数填满sum-n
list1.pop_front();
find_factor(sum, n-1); //不放n,n-1 个数填满sum
}
int main()
{
int sum, n;
cout << "请输入你要等于多少的数值sum:" << endl;
cin >> sum;
cout << "请输入你要从1.....n 数列中取值的n:" << endl;
cin >> n;
cout << "所有可能的序列,如下:" << endl;
find_factor(sum,n);
return 0;
}

 

 

逻辑分析:

1、比起微软,google,百度这些公司,中兴的面试题还是略显逗比的,并非是说难度上差异,而是中兴的题目总是显得不伦不类。本题其实就是考察数的组合,对于此类问题,通常手段都是递归,而我们的目标就在于找出递归式。

2、问题其实本质上就是0/1背包问题,对于每一个n,我们采用贪婪策略,先考察是否取n,如果取n,那么子问题就变成了find(n-1,m-n),而如果舍弃n,子问题则为find(n-1,m)。至此,我们利用DP思想找到了递归式(很多时候,所谓动态规划,贪婪只是一念之差)。

3、那么,如何制定解的判定策略?我们知道,递归需要边界条件,而针对背包问题,边界条件只有两种,如果n<1或者m<1,那么便相当于“溢出”,无法combo出m,而另一种可能就是在剩余的n个里恰好满足m==n,即此时 背包刚好填充满,输出一组解单元。除此之外,再无其他。

C源码:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int length;

void findCombination(int n,int m,int *flag)
{
	if(n < 1 || m < 1)
		return;
	if(n > m)
		n = m;
	if(n == m)
	{
		flag[n-1] = 1;
		for(int i=0;i<length;i++)
		{
			if(flag[i] == 1)
				printf("%d\t",i+1);
		}
		printf("\n");
		flag[n-1] = 0;
	}
	flag[n-1] = 1;
	findCombination(n-1,m-n,flag);
	flag[n-1] = 0;

	findCombination(n-1,m,flag);
}

int main()
{
	int n, m;
	scanf("%d%d",&n,&m);
	length = n;
	int *flag = (int*)malloc(sizeof(int)*length);
	findCombination(n,m,flag);
	free(flag);
	return 0;
}

注:我们设置flag背包,用来标注对应的n+1是否被选中,1表示被选中,0则表示未选中,每当满足m==n时,则输出一组解。程序容易产生逻辑bug的地方在于length的使用(读者可以思考一下为何需要全局变量length,而不是直接使用n来代替for循环)。

相关文章
|
1天前
|
人工智能 运维 安全
主流AI Agent框架对比:Hermes Agent与OpenClaw核心差异与选型指南及部署教程
随着AI智能体技术全面落地,各类开源AI Agent开发框架层出不穷,其中 **Hermes Agent** 与 **OpenClaw** 凭借成熟的架构、丰富的功能、活跃的社区生态,成为2026年个人开发者、初创团队与中小企业最常用的两大主流框架。二者均支持大模型对接、工具调用、自动化任务、多轮会话等核心智能体能力,能够帮助开发者快速搭建生产级AI智能体应用。
179 1
|
3月前
|
人工智能 Linux API
OpenClaw+MiniMax M2.7集成流程:本地/阿里云端部署、大模型配置与复杂任务执行教程
MiniMax M2.7是2026年面向AI Agent场景深度优化的文本大模型,在指令遵循、长程任务、代码能力与多Skill协同上实现显著突破,成为适配OpenClaw(小龙虾)的高性价比国产模型选择。其核心优势集中在Agentic能力强化,可稳定支撑浏览器自动化、API调用、联网检索、办公文档处理、子Agent调度等复合任务,在复杂自动化场景中表现接近海外头部模型,成本仅为高端模型的零头,适合长期挂载OpenClaw执行稳定任务。
3295 2
|
8月前
|
存储 人工智能 缓存
运维智能体(SRE Agent)技术分级能力要求
本标准规范了运维智能体在场景应用、协同能力、能力建设及底座构建方面的技术要求,适用于公共与私有环境下的服务与产品。依据AI技术发展,定义了从初始级到优秀级的三级能力框架,涵盖感知、控制、行动等核心能力,推动运维智能化升级。
运维智能体(SRE Agent)技术分级能力要求
|
10月前
|
存储 人工智能 5G
6G来了,智能设备会“脱胎换骨”吗?
6G来了,智能设备会“脱胎换骨”吗?
662 4
|
11月前
|
存储 文件存储 数据安全/隐私保护
阿里云企业邮箱收费标准价格:免费版/标准版/尊享版/集团版费用及功能对比
阿里云企业邮箱提供免费版、标准版、尊享版和集团版,满足不同企业需求。免费版适合初创团队,标准版性价比高,尊享版适合高存储需求企业,集团版适用于大型集团。价格从0元到9500元/年不等,支持多账号、大容量网盘及高级权限管理。企业可根据规模与功能需求选择合适版本。
1949 12
|
机器学习/深度学习 人工智能 算法
认识AI,探索AI如何奇思妙想
AI的快速演进正在加速AGI的到来,不止步于工具的AI让我们意识到它也绝不仅仅意味着算法和代码。当我们真的把人工智能当作智能体的时候总要去思考“AI是什么”这一个问题。关于意识的理论模型各自提供了意识产生机制于AI的不同解释,目前尚无定论,但它们都在学术界激发了广泛的讨论与研究。也欢迎你在评论区聊聊你会怎么向别人介绍AI?你认为AI是如何奇思妙想的,它具有意识吗?
975 0
|
编译器 开发工具 数据安全/隐私保护
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
本文提供了一个关于如何在Gitee上进行多人协作和版本控制的详细教程,包括新建和初始化仓库、克隆仓库、邀请好友共同管理仓库以及注意事项,旨在帮助用户顺利进行代码协作开发。
3704 1
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
|
小程序 测试技术 程序员
『软件工程12』软件工程实践方法——软件测试
该文章详细阐述了软件测试的重要性和基本原则,并按测试阶段顺序介绍了单元测试、集成测试、确认测试以及系统测试的具体内容和实施步骤。
『软件工程12』软件工程实践方法——软件测试
|
缓存 Java 测试技术
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能