`
javasalatu
  • 浏览: 756798 次
  • 性别: Icon_minigender_2
  • 来自: 北京
博客专栏
96df99eb-e89d-3228-9c8e-967fc745ec52
程序员的自我经营之道
浏览量:7821
文章分类
社区版块
存档分类
最新评论

搜狗面试题:从N个正实数中选若干个数之和最接近M的递归实现

 
阅读更多

//搜狗:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。
//需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度。
public void FindDouble(double[] A,bool[] Exsits, int N,double M,int i,double PreCurrSum,bool Exists)
{
double theCurrSum = PreCurrSum + (Exists ? A[i - 1] : 0);
Exsits[i - 1] = Exists;
double theNewDelta = Math.Abs(theCurrSum - M);
if (theNewDelta < MinDelta)
{
MinDelta = theNewDelta;
for (int j = i + 1; j <= N; j++)
{
Exsits[j - 1] = false;
}
CopyResult(Exsits, N);
}
if (i < N)
{
FindDouble(A, Exsits, N, M, i + 1, theCurrSum,false);
FindDouble(A, Exsits, N, M, i + 1, theCurrSum,true);
}
}
private void CopyResult(bool[] Exsits, int N)
{
for (int i = 0; i < N; i++)
{
Exist[i] = Exsits[i];
}
}
private void button3_Click(object sender, EventArgs e)
{
double[] A = new double[] {1.5,2.5,3.0,5.0,8.0,9.0};
bool[] E = new bool[] { false, false, false, false, false, false };
Exist = new bool[6];
MinDelta = double.MaxValue;
FindDouble(A, E, 6, 12, 1, 0.0, false);
FindDouble(A, E, 6, 12, 1,0.0, true);
}

PS:原来这种递归处理是典型的背包问题,长见识了。

分享到:
评论

相关推荐

    N选M的所有组合(递归与非递归实现)

    本主题将详细探讨如何从N个不同的元素中选择M个元素的所有可能组合,同时提供递归和非递归两种实现方式。 首先,我们来理解组合的概念。组合是指在不考虑顺序的情况下,从N个不同元素中选择M个元素的方法数。在数学...

    05_JavaSE面试题:递归与迭代.avi

    05_JavaSE面试题:递归与迭代

    用递归法计算从n个正整数中选择k个数的不同组合数

    在计算机科学和数学中,计算从n个正整数中选择k个数的不同组合数是一项基本的任务,这涉及到组合数学中的组合(Combination)概念。组合是指从一个集合中不考虑顺序取出k个元素的方法数,它与排列(Permutation)...

    面试高频算法题总结-剑指Offer题解

    面试题9:用两个栈实现队列 面试题10:裴波那契数列 面试题11:旋转数组的最小数字 面试题12:矩阵中的路径 面试题13:机器人的运动范围 面试题14:剪绳子 面试题15:二进制中1的个数 面试题16:数值的整数次方 面试...

    ackermann函数的递归实现和非递归实现

    阿克曼函数的递归定义非常简洁,通常表示为`A(m, n)`,其中`m`和`n`是非负整数。函数有以下基础情况: 1. `A(0, n) = n + 1` 对于所有非负整数`n`。 2. `A(m, 0) = A(m - 1, 1)` 对于所有`m &gt; 0`。 对于其他情况,...

    C++面试题集.pdf

    本文档提供了一系列C++面试题,涵盖了内存拷贝、双向链表、费波那其数列、类的构造函数、析构函数和赋值函数、循环、单向链表类的实现、二叉树实现等多个方面的知识点。 内存拷贝 面试题:写一个函数,完成内存...

    实现从M个字符中选择N个字符的递归程序

    实现从M个字符中选择N个字符的递归程序!

    算法面试通关手写代码40讲 .txt

    面试题:设计和实现一个LRU Cache缓存机制.mp4 55.理论讲解: LRU Cache.mp4 54.面试题:岛屿的个数&朋友圈(下).mp4 53.面试题:岛屿的个数&朋友圈(上).mp4 52.理论讲解:并查集.mp4 51.面试题:编辑距离.mp4 50...

    MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    "MyBatis之自查询使用递归实现 N级联动效果" MyBatis是一个功能强大且灵活的持久层框架,它支持自查询和递归查询,下面我们将探讨如何使用MyBatis实现 N级联动效果。 递归查询 递归查询是指在一个查询中调用自身...

    N个数全排列的非递归算法

    标题 "N个数全排列的非递归算法" 涉及的是计算机科学中的经典问题——全排列。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的所有可能组合。在这个场景中,非递归算法指的是不依赖递归...

    2021最新大厂AI面试题:107题(含答案及解析).pdf

    在阿里AI岗位面试题中,我们看到了对于损失函数和激活函数的考查,这两个概念是深度学习中的基础知识。损失函数衡量模型预测值与真实值之间的差异,常用的损失函数有均方误差(MSE)、交叉熵损失等。而激活函数则是...

    递归子程序计算ackermann函数ACK(m,n)

    每次递归调用时,我们都需要维护m和n的值,这可以通过在堆栈上创建一个结构来实现,这个结构包含m、n和结果地址。在递归调用期间,栈帧会不断增长,直到n减到0,这时我们可以直接计算ACK(m, 0) = ACK(m-1, 1)。 ...

    从N选取M个数的所有组合数C++描述C++描述

    从N选取M个数的所有组合数C++描述 思路: 第一位可以取N中的任何一个,第二位只能取第一位后面的数字任何一个, 即第M位只能取第M-1位后面的数字任何一个,每一位递归一次

    m个数中选n个的选法

    ### m个数中选n个的选法:递归算法详解 #### 背景介绍 在计算机科学中,组合问题是编程中一个常见的问题。题目“m个数中选n个的选法”是一个典型的组合问题,即从m个不同的元素中选取n个元素的所有可能的组合方式。...

    Ackermann 递归与非递归两种解法

    虽然这种方法可能比递归解法更易于理解和实现,但由于 Ackermann 函数的复杂性,其运行时间仍然会随着 m 和 n 的增大而急剧增加。 在 Visual C++ 6.0 中实现 Ackermann 函数,可以创建一个名为 `Ackermann` 的函数...

    C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

    本文实例讲述了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法。分享给大家供大家参考,具体如下: /*求二叉树叶子节点个数 -- 采用递归和非递归方法 经调试可运行源码及分析如下: ***/ #include #...

    java递归实现N个数全排列输出

    当给定一个包含N个不同元素的集合时,全排列就是要列出所有可能的N!(N的阶乘)种排列方式。在这个场景中,我们将探讨如何使用Java语言,通过回溯法来递归实现全排列的输出。 首先,我们需要理解回溯法的基本概念。...

    PASCAL记忆化递归《取数》

    从这N个数中任取出若干个数(不能取相邻的数),要求得到一种取法,使得到的和为最大。例如:当N=5时,有5个数分别为:13,18,28,45,21 此时,有许多种取法,如: 13,28,21 和为62 13, 45 和为58 18,45 和为63...

    一个简单的C#WindowsForm程序,用递归求N!

    阶乘是数学中的一个概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常表示为n!。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。在编程中,我们可以通过递归或循环来实现阶乘的计算。 递归是一种解决问题的方法...

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉 例如N=6,M=5

    例如,使用循环链表可以先定义一个链表节点结构体,然后创建N个节点并链接成环,接着通过循环遍历和修改链表来解决问题。使用递归的话,可以编写一个函数,接收当前存活人数和报数M作为参数,递归调用自身处理下一轮...

Global site tag (gtag.js) - Google Analytics