【发布时间】:2021-04-25 22:30:14
【问题描述】:
我想修改一个函数,该函数负责将子数组(在本例中为向量)写入控制台,其中最高和小于或等于给定和。我想改变的是函数在计算总和时应该能够多次使用同一个元素。
例如:如果给定的向量是{30, 60},而所需的总和是135,它现在会写出60, 30,但我想做的是写60, 60、60, 30, 30或30, 30, 30, 30 以任意顺序排列,因为给定向量中的元素在计算总和时应该是可重用的。
这是当前形式的函数:
void findMaxSubarraySum(std::vector<int> arr, int sum)
{
int curr_sum = arr[0], max_sum = 0, start = 0;
std::vector<int> maxArr, currArr;
currArr.push_back(arr[0]);
for (int i = 1; i < arr.size(); i++) {
if (max_sum <= curr_sum) {
max_sum = curr_sum;
maxArr = currArr;
}
while (curr_sum + arr[i] > sum && start < i) {
curr_sum -= arr[start];
currArr.erase(std::remove(currArr.begin(), currArr.end(), arr[start]), currArr.end());
start++;
}
curr_sum += arr[i];
currArr.push_back(arr[i]);
}
if (curr_sum <= sum) {
max_sum = curr_sum;
maxArr = currArr;
}
for (int element : maxArr) {
std::cout << element << ", ";
}
}
我尝试通过将以下代码添加到函数的开头将向量的每个元素添加到自身 sum / element 次:
for (int element : arr) {
int n = sum / element;
for (int i = 1; i < n; ++i) {
arr.push_back(element);
}
}
但是这样做的问题是它不仅效率很低,而且也不起作用,因为程序只是退出而没有输出任何东西。
我怎样才能修改这个功能(或者只写一个不同的工作方式)来做到这一点?
【问题讨论】:
-
在编写一行代码之前,您应该先在纸上解决这个问题。然后,一旦你解决了这个问题,然后编写适合你所写内容的程序。仔细考虑已经编写的显然效率低下或“不起作用”的代码不会有帮助。
-
@PaulMcKenzie 好吧,我试过了,但到目前为止,我以前的计划都没有真正奏效,这是我得到的最接近的计划。我最初的想法是尝试递归,但我不知道如何检查我得到的是否比以前的数组大,因为我所做的是经历所有可能性,并且每次检查可能性的第一个元素被更改一个新的递归行开始了,我不知道如何检查这里的最终结果是否比上一个递归行更好。
-
第一步是弄清楚如何描述问题。您并不是真正要求子数组,而是要求具有替换的数组元素的每个组合,总和最多为 M。 (替换只是意味着您替换每个选择的元素,以便可以重复使用)。
-
是的,没错,但在我当前的代码中,它是一个子数组,但它并没有真正的区别,因为它的所有元素都是在满足某些条件并且没有停止的情况下手动添加的我添加了一些会改变它的子数组性质的东西。 @无用
-
您在谈论数据的组织,这是特定于您的代码的。我说的是这些操作的一般名称,因此您可以找到现有的参考资料,而不是试图从头开始重新发明组合数学。
标签: c++ vector sum c++17 sub-array