C++ 如何求解这个算法c++;

C++ 如何求解这个算法c++;,c++,arithmetic-expressions,C++,Arithmetic Expressions,我有和数组中的一些元素,比如 5,3,7 和初始intA(如第一种情况下为5)。我必须对数组元素中的这个数字进行加减运算,以得到小于或等于M(在这种情况下为10)的最大数字。中间操作的结果不能超过M。我只能使用数组元素一次 例如,这种情况的解决方案是 A = 5 A - 5 = 0 0 + 3 = 3 3 + 7 = 10 10等于最终结果M 什么算法可以用来解决这个问题?我用C++编写这个程序。 这里有一个可能的算法: A = 5 M = 10 highest number = 0 arr

我有和数组中的一些元素,比如

5,3,7

和初始int
A
(如第一种情况下为5)。我必须对数组元素中的这个数字进行加减运算,以得到小于或等于
M
(在这种情况下为10)的最大数字。中间操作的结果不能超过
M
。我只能使用数组元素一次

例如,这种情况的解决方案是

A = 5

A - 5 = 0
0 + 3 = 3
3 + 7 = 10
10等于最终结果
M


什么算法可以用来解决这个问题?我用C++编写这个程序。

这里有一个可能的算法:

A = 5
M = 10
highest number = 0
array of numbers = {5, 3, 7}

function()
    call recursive function(empty string, index 0, A)
    print highest number

recursive function(string of operations used so far, int current element index, int sum so far)
    if the length of the string of operations == number of ints in array
        if sum so far > highest number
            highest number = sum so far
        return
    B = sum so far + current element
    C = sum so far - current element

    if B <= M
        recursive function(string of operations plus appended '+', int current element index + 1, B)

    if C <= M
        recursive function(string of operations plus appended '-', int current element index + 1, C)
A=5
M=10
最高数字=0
数字数组={5,3,7}
函数()
调用递归函数(空字符串,索引0,A)
打印最大数字
递归函数(到目前为止使用的操作字符串、int当前元素索引、int至今求和)
如果操作字符串的长度==数组中的整数数
如果到目前为止总和>最大值
最高数字=迄今为止的总和
返回
B=迄今为止的总和+当前元素
C=迄今为止的总和-当前元素
如果B我认为没有一种“智能”算法可以在线性时间甚至多项式时间内解决这个问题。恐怕唯一可行的方法是尝试所有可能的组合,并选择最好的组合。不过,您可以使用一些在概念上类似于更快获得结果的技术

我会这样做

基本算法 首先,我将生成所有可能的组合。对于N个数字中的每一个,你可以选择求和或减法,所以你有两个选择。这意味着总的来说,你有2^N个可能的选择。在您的示例中,当N=3时,它们将是:
-
-+
-+-
-++
+-
+-+
+-
++
。(这类似于二进制计数,从0=000到7=111)


此时,您必须“执行”每个序列。对于这些数字(
5,3,7
),第一个序列表示-5-3-7。您必须一次运行一个步骤,每次都检查您没有超过目标M,因为这是必需的。由于初始值A为5,这将导致:5-5=0,并且由于0,请在数学网站上查询算法。如果你不能实现这个算法,那么在这个网站上提问。我只是想要一个算法来解决这个问题…然后问数学的家伙,例如,在这里我们讨论编程问题。oo。。。我不知道那件事。。。谢谢…@StillLearning:这是一个有争议的观点。有些人同意你的观点,但事实上,报告说,一个涉及软件算法的问题是可以的。当然,它也说他们觉得最好的问题应该有一些源代码,但这并不是一个严格的要求。OP没有显示任何代码,但他也没有要求一些。他想有一个算法,然后他会自己编码。我认为这个问题很好,不过添加标签会很好。回答得很好。我不知道你为什么要检查
B
C
是否为>=0;我认为唯一的要求是它们不超过10。但无论如何,修改都是微不足道的。然后你也会打印一些不同于我打印的内容,也就是说,你打印所有可能的解决方案,而不仅仅是给出最高结果的解决方案。但这只是一种选择。我喜欢你的回答。干得好@考虑到其他严格的要求,我想使用这些负数有点奇怪。我修改了条件,现在可以接受底片了。至于我打印的内容,它可以很容易地修改为打印用户需要的任何内容,但是算法和演示现在都应该打印最高的数字。@FabioTuarti,你的答案对我的问题并不完美,但是在对数组进行排序并使用树概念后,解决了我的问题。。谢谢
                               Root
                             /      \
                            /        \
                           /          \
                          /            \
                         /              \
                        -                +
                     /     \          /     \
                    -       +        -       +
                   / \     / \      / \     / \
                  -   +   -   +    -   +   -   +