递归中使用一维数组
Using one-dimesional array in recursion
最近我一直在研究分区问题。我做了一个研究,我发现它可以用维基页面上的一个算法来解决。下面是伪算法:
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。从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;
}
最简单(但肯定不是最好)的方法是引入一个全局变量:
#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++标准的一部分(参见c++是否支持变长数组?和为什么变长数组不是c++标准的一部分?)。
将其作为参数传递给函数
bool matrix (int a, int b, int num_arr[])
{
...
matrix(a-1,b,num_arr);
...
}
相关文章:
- 将二维数组的所有元素插入到一维数组中
- C++语法差异:二维和一维数组(指针算术)
- 将一维数组写入 CSV C++中的不同列?
- C++:将矩阵存储在一维数组中
- 如何在一维数组中的每个元素中都有多个int值
- 以C++填充一维数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 如何在 <threads> c++ 中使用和一维数组进行矩阵乘法?
- C++按内存地址将多维数组更改为一维数组
- 在 c++ 中返回一维数组时出错
- 一维数组映射方式的性能差异问题
- 如何使用一维数组更改二维数组中的值?
- 使用二维数组作为一维数组是否正确?可能会导致未定义的行为左右?
- 将一维数组转换为二维数组
- 如何使用一维数组列表初始化二维数组
- 在一维数组中对二维进行排序
- 将一维数组的索引转换为二维数组
- 通过访问二维数组实现双线性插值的概念类似于一维数组
- 将二维数组传递到只需要一维数组的函数中(C++)
- 递归中使用一维数组