2015-11-18 102 views
0

我试图计算矢量 的连续元素的最大总和,但我真的不知道该怎么办:计算连续元素(列表中的)最大的总和

我开始代码即:

#include <iostream> 
#include <vector> 
using namespace std; 

void calcule_somme(vector<int> tab); 

void calcule_somme(vector<int> tab) { 

    int somme_partielle(0); 
    vector<int> element_les_plusgrand; 

    for(size_t i(0);tab.size();++i) { 

     for(size_t j(i+1);tab.size();++i) { 
       element_les_plusgrand.pushback(tab[i]); 

       if (tab[i]+tab[j]>compteur) { 
        element_les_plusgrand.push_back(tab[j]); 
        compteur = tab[i]+tab[j]; 
       } 


} 







int main() { 





    return 0; 
}` 

的函数必须返回:连续元素的最大和为“4,5,78”至极等于87

感谢您的帮助

+0

你的意思是最大的连续元素总和?不是所有元素的总和(因为来自1..n的元素是连续的)与你想要的相同? – Nandu

+0

输入是什么来获得该结果? –

+0

Nop,就像我在放置的列表中一样,有负数..我忘了放列表。{-4,5,6,-9,24,-35,4,5,78}这里是它,所以我想要像这样的一个列表的连续数最大的总和 – Courbesteak2723

回答

0

首先,您需要跟踪两个向量,一个保存最大的字符序列,一个保存当前正在计算的值。

从那里,你只需要遍历源矢量中的元素,跟踪矢量中的前一个值和当前值。

如果当前值大于先前值,则将当前值推入当前向量,然后将先前值分配给当前值。

如果小于(或者我假设等于),则连续序列完成,您应该从下一个序列开始。这意味着,你需要做到以下几点:

  1. 确定当前矢量的大小大于或等于最大的矢量的大小电流矢量的总和比最大的总和。如果是,则分配最大=当前;
  2. 清除当前列表
  3. 分配前一个当前的int值。

这里是我会怎么写呢:

int sum(const vector<int>& tab) { 
    int sum = 0; 
    for (size_t i = 0; i < tab.size(); i++) { 
     sum += tab[i]; 
    } 

    return sum; 
} 

vector<int> calculate_some(const vector<int>& tab) { 
    vector<int> ret, current; 

    int previous = tab[0]; 
    current.push_back(previous); 
    for (size_t i = 1; i < tab.size(); i++) { 
     current.push_back(tab[i]); 

     if (tab[i] <= previous || i == (tab.size() - 1)) { 
      if (current.size() >= ret.size() && sum(current) > sum(ret)) 
       ret = current; 

      current.clear(); 
     } 

     previous = tab[i]; 
    } 

    return ret; 
} 

这里是我如何打电话吧:

int main() { 

    vector<int> tab = { -4,5,6,-9,24,-35,4,5,78 }; 
    vector<int> results = calculate_some(tab); 

    for (size_t w(0); w<results.size(); ++w) { 
     cout << results[w] << " "; 
    } 

    system("pause"); 


    return 0; 
} 
+0

我试了它的列表,我写了,但它送我回-4 5 6而不是4 5 78与:矢量 tab = { - 4,5 ,6,-9,24,-35,4,5,78}; sum(tab); calculate_some(tab); calculate_some(tab); – Courbesteak2723

+0

嗯。我用相同的数据集运行它,并得到了预期的答案。你准确复制了吗? –

+0

要显示你的最终矢量,你想要的只是在“ret”上做了一个for循环? – Courbesteak2723

0
#include <iostream> 
#include <vector> 
using namespace std; 







int sum(const vector<int>& tab) { 
    int sum = 0; 
    for (size_t i = 0; i < tab.size(); i++) { 
     sum += tab[i]; 
    } 

    return sum; 
} 

vector<int> calculate_sume(const vector<int>& tab) { 
    vector<int> ret, current; 

    int previous = -32767; 
    for (size_t i = 0; i < tab.size(); i++) { 
     if ((tab[i] > previous) == false) { 
      if (current.size() >= ret.size() && sum(current) > sum(ret)) 
       ret = current; 

      current.clear(); 
     } 

     current.push_back(tab[i]); 
     previous = tab[i]; 
    } 
    for(size_t w(0);w<ret.size();++w) { 
     cout << ret[w]<< " "; 
    } 
    return ret; 
} 


int main() { 

    vector<int> tab ={-4,5,6,-9,24,-35,4,5,78}; 
    sum(tab); 
    calculate_sume(tab); 





    return 0; 
} 

告诉我-4 5 6

0

伪代码:

Algorithm Biggest_Consecutive_Sum 
Input: Vector v 
Output: Biggest_Sum 

begin 

    index = 0, Biggest_Sum = 0 

    while(index < v.size()){ 

     Sum = 0 

     while (Sum + V[index] > Sum){ 
      Sum = Sum + V[index] 
      index = index + 1 
     } 

     if(Sum > Biggest_Sum) Biggest_Sum = Sum 

     index = index + 1 
    } 

    return Biggest_Sum 

end