0

最近我一直在研究分区问题。我做了一项研究,发现可以使用 wiki 页面上的算法来解决。这是伪算法:

   INPUT:  A list of integers S
   OUTPUT: True if S can be partitioned into two subsets that have equal sum
1 function find_partition( S ):
2     N ← sum(S)
3     P ← empty boolean table of size (\lfloor N/2 \rfloor  +  1) by (n + 1)
4     initialize top row (P(0,x)) of P to True
5     initialize leftmost column (P(x, 0)) of P, except for P(0, 0) to False
6     for i from 1 to \lfloor N/2 \rfloor 
7          for j from 1 to n
8          P(i, j) ← P(i, j-1) or P(i-S[j-1], j-1)
9     return P(\lfloor N/2 \rfloor , n)

使用递归,您可以计算是否可以达到数组中整数的某个总和,如果可以达到,则返回 true。我从0开始,sumOfTheIntegers/2然后回到0,直到找到解决方案。当我找到小于或等于平均值​​的最大可能整数和时,我计算两组整数之间的差(average-lowestSumLowerorEqualtoAverage)*2

但是后来我遇到了问题,如何在递归中包含一维数组?

这是代码,它应该可以工作,但由于问题,我还没有测试过。所以也许代码包含小错误。但这不是问题,我稍后会解决它。

#include <iostream>
#include <cmath>
using namespace std;
bool matrix (int a, int b)
{
    if(b == -1)  return true;
    else if (a == -1) return false;
    else if(matrix(a-1, b) == true) return true;
    else if(matrix(a-1,b-numbers[a-1]) == true) return true;
    else return false;
}
int main()
{
    int number, sum = 0;
    cin >> number;
    int numbers[number];
    for(int i = 0; i<number; i++)
    {
        cin >> numbers[i];
        sum += numbers[i];
    }
    double average = sum/2.0;
    for(int i = floor(sum/2); i!= 0; i--)
    {
        if(matrix(number+1, i) == true)
        {
            cout << abs(average-i)*2;
            break;
        }
    }
    return 0;
}
4

2 回答 2

1

最简单(但肯定不是最好)的方法是引入一个全局变量:

#include <vector>
std::vector<int> numbers;

/* ... */

int main(){
    int number;
    cin >> number;
    numbers.resize(number);
    /* ... */
}

另一种可能性是使用附加参数:

bool matrix (int a, int b, const std::vector<int>& numbers)
{
    if(b == -1)  return true;
    else if (a == -1) return false;
    else if(matrix(a-1, b,numbers) == true) return true;
    else if(matrix(a-1,b-numbers[a-1],numbers) == true) return true;
    else return false;
}

请注意,int numbers[number]它实际上使用了特定于编译器的扩展 (VLA),并且不是 C++ 标准的一部分(请参阅Does C++ support Variable Length Arrays?Why are not variable-length arrays part of the C++ standard?)。

于 2013-03-08T22:49:57.437 回答
0

将其作为参数传递给函数

bool matrix (int a, int b, int num_arr[])
{
  ...
  matrix(a-1,b,num_arr);
  ... 
}
于 2013-03-08T22:47:49.383 回答