Форум программистов, компьютерный форум CyberForum.ru

проблема с присвоением - C++

Восстановить пароль Регистрация
 
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
19.11.2011, 07:34     проблема с присвоением #1
Возникла такая проблема, нужно к элементу вектора прибавить число, но у меня проблема с перегрузкой оператора, подскажите как лучше это сделать!!!
Условие!
Имеется N камней веса А1,А2,...,АN.
Необходимо разбить их на две кучи таким образом, чтобы веса куч отличались не более чем в 2 раза. Если этого сделать нельзя, то указать это.
Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <cstdlib>
#include <iostream>
#include "method.cpp"
#include <fstream>
#include <iomanip>
using namespace std;
 
int main(int argc, char *argv[])
{
      
    ifstream input_file("file.txt"); // îòêðûâГ*ГҐГ¬ ГґГ*éë Г± Г¤Г*Г*Г*ûìè
    vector<selection<int> > stones; // Âåêòîð ýëåìåГ*òîâ
    selection<int> e; //  Г±ГІГ°ГіГЄГІГіГ°Г*
    while(!input_file.eof()) // ïåðåìåùГ*ГҐГ¬ ГґГ*éëû Гў âåêòîð
    {
      input_file>>e.x;
      stones.push_back(e);
    }
    create_lot(stones);
    arrange_lot(stones);
    arrange_bags(stones);
    for(int i=0; i<stones.size(); i++) // Âûâîä
      cout<<setw(3)<<stones.at(i).x<<endl;
    input_file.close();
  
    system("PAUSE");
    return EXIT_SUCCESS;
}
struct.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef SELECTION
#define SELECTION
 
template<class T> 
struct selection{
  T x; // Êëþ÷
    bool operator < (selection<T> e) // ÔóГ*êöèÿ Г±Г°Г*ГўГ*ГҐГ*ГЁГї
  {
     if(x < e.x)
        return true;
      else
        return false;
    
  }
int selection::operator+(selection<T> e)
{   return selection(x+e.x);
                    }
  
};
#endif
method.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "struct.h"
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
using std::endl;
 
 
template<class T> 
void create_lot(vector<T> &stones) //ñîçäГ*Г*ГЁГҐ Г¬Г*Г±Г±ГЁГўГ* âåñîâ ГЄГ*Г¬Г*ГҐГ©
{
        cout<<stones.size()<<" Number of stones. They weigh:\n";
        for(int k=0;k < stones.size();k++);
}
 
template<class T> 
void arrange_lot(vector<T> &stones) //ñîðòèðîâêГ* ГЇГ® óáûâГ*Г*ГЁГѕ
{
int i,j;
T temp;
 
for(i=0;i < stones.size()-1;i++)
        for(j=i+1; j < stones.size() ;j++)    
                if(stones.at(i) < stones.at(j))
                    {   temp = stones.at(i);
                        stones.at(i) = stones.at(j);
                        stones.at(j) = temp;  }
                        
}
template<class T> 
void arrange_bags(vector<T> &stones) //ñîçäГ*ГҐГІ äâå ГЄГіГ·ГЁ áîëåå áëèçêèå ГЇГ® Г°Г*çìåðó
{
int k1, k2, i, sum1=0, sum2=0;
 
T bag1[stones.size()-1],bag2[stones.size()-1];
for(i=0;i<stones.size();i++)
{
        if(sum1<=sum2)
        {       bag1[k1]=stones.at(i);
                sum1+=stones.at(i);//вот тут вот ругается
                k1++;}
        else
        {       bag2[k2]=stones.at(i);
                sum2+=stones.at(i);// и вот тут
                k2++;}
}
if(1.0*sum1/sum2 <=2)
{       cout<<"\n heap 1: ";
        for(i=0;i<k1;i++)
                //cout<<bag1[i]<<"  ";
        cout<<"\n weigh 1: "<<sum1<<endl;
        cout<<"\n heap2: ";
        for(i=0;i<k2;i++)
                //cout<<bag2[i]<<"  ";
        cout<<"\n weigh 2: "<<sum2<<endl;
}
else cout<<"more 2\n";
}
function.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef VIBOR
#define VIBOR
 
#include <vector>
 
using std::vector;
 
template<class T> void create_lot(vector<T>&);
template<class T> void arrange_lot(vector<T>&);
void arrange_bags(vector<T> &)
 
#endif
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2011, 07:34     проблема с присвоением
Посмотрите здесь:

помогите пожалуйста проблема с перегрузкой операторов '-' >> <<, возможно еще с конструктором без параметров наверно проблема C++
Проблема C++
C++ Проблема с указателями!
Проблема с do-while C++
Загвоздка с присвоением C++
Ошибка с присвоением значений к массивам C++
C++ Конструктор с присвоением

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.11.2011, 18:57     проблема с присвоением #2
Прямой перебор. Первое попавшееся разделение, подходящее под условие.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>
#include <ctime>
#include <cstdlib>
 
struct RandomInteger  {
  RandomInteger(const int &min, const int &max)
    : min_(min), max_(max) {}
  float operator()() {
    return (rand() % (max_ - min_ + 1) + min_);
  }
 private:
  int min_, max_;
};
 
template <class ValueType>
std::ostream &operator<<(std::ostream &stream, std::vector<ValueType> &vector) {
  typedef std::vector<ValueType> Vector;
  for (typename Vector::iterator i = vector.begin(); i != vector.end(); ++i)
    stream << (*i) << " ";
  return stream;
}
 
// побочный эффект -- сортировка значений
template <class Iterator>
Iterator findMiddleWeight(Iterator begin, Iterator end) {
  std::sort(begin, end);
  Iterator pivot = begin + (end - begin) / 2;
  int sumLeft = std::accumulate(begin, pivot, 0);
  int sumRight = std::accumulate(pivot,  end, 0);
  while (pivot >= begin && pivot != end) {
    if (std::max(sumLeft, sumRight) / std::min(sumLeft, sumRight) < 2)
      return pivot;
    if (sumLeft > sumRight) {
      --pivot;
      sumRight += *pivot;
      sumLeft -=*pivot;
    } else {
      sumRight -= *pivot;
      sumLeft +=*pivot;
      ++pivot;
    }
  }
  return end;
}
 
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  size_t stonesCount = 23;
  std::vector<int> stones(stonesCount);
  std::generate(stones.begin(), stones.end(), RandomInteger(100, 1000));
  std::cout << stones << std::endl;
 
  std::vector<int>::iterator middle = findMiddleWeight(stones.begin(),
    stones.end());
 
  if (middle == stones.end()) {
    std::cout << "Cannot be done." << std::endl;
  } else {
    std::cout << stones << std::endl << "Left: " << std::endl;
    for (std::vector<int>::iterator i = stones.begin(); i != middle; ++i)
      std::cout << *i << " ";
    std::cout << "| ";
    for (std::vector<int>::iterator i = middle; i != stones.end(); ++i)
      std::cout << *i << " ";    
    std::cout << "Sum left:  " << std::accumulate(stones.begin(), middle, 0) <<
      std::endl << "Sum right: " << std::accumulate(middle, stones.end(), 0) <<
      std::endl;
  }
}
Yandex
Объявления
19.11.2011, 18:57     проблема с присвоением
Ответ Создать тему
Опции темы

Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru