Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
1

Распределить числа в два массива так, чтобы разность между их суммами была минимальной

14.12.2013, 19:03. Показов 3144. Ответов 7
Метки нет (Все метки)

Задача: дан массив N чисел. Нужно раскидать эти числа в два массива так, чтобы разность между их суммами была минимальной.
Пример: 100 1 2 3 4
Берем первое число - 100, кидаем в первый массив, во втором - 0. Берем второе - 1, кидаем туда, где сумма чисел меньше, т.е. во второй (1 - 100, 2 -1). Третье числи - 2. В первом - 100, меньше во втором, значит кидаем туда и т.д. В итоге получится в первом - 100, во втором - 1+2+3+4

Вот код. Но почему то он не пашет. Пожалуйста, найдите ошибку.

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
#include <iostream>
using namespace std;
const int N=5;
int main(){
int B[N],C[N],i,j,t;
int A[]={8,7,7,5,5};
for(int i=0;i<N;i++){ //сортируем камни по возрастанию их веса//
        for (int j=0;j<N-i;j++){
    if (A[j]>A[j+1]){
    t=A[j];
    A[j]=A[j+1];
    A[j+1]=t;}}}
     cout <<"otsortirovanniy massiv =>  ";
    for (int i=0;i<N;i++)
    cout<< A[i] <<" ";
    cout<<endl;
int Sum=0;
        for (int j=0;j<N;j++){
                if(A[j]!=A[5])
        {Sum += A[j];}}
        cout<<"Summa vesov = "<<Sum<< '\n';
int d=Sum/2;//находим полусумму//
cout<<"polusumma = "<<d<<endl;
int newsum=0;
for(i>0;i=N-1;i--){
    for(int j=0;j<N;j++){
         for(int k=0;k<N;k++){
    if (A[i]<d&&newsum<d)
        B[j]=A[i],newsum=newsum+B[j];
        else
        C[k]=A[i];}}}}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2013, 19:03
Ответы с готовыми решениями:

Распределить камни в две кучи так, чтобы разность весов этих двух куч была минимальной
Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ У вас есть несколько камней...

Распределить камни в две кучи так, чтобы разность весов этих двух куч была минимальной
Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ У вас есть несколько камней...

Распределить элементы массива в два так, что бы разница сумм их элементов была минимальной
не прошу сделать, только направить вообще на алгоритм, а то я в ней запутался, не понимаю как...

Разделить N камней на M куч так, чтобы разность между кучами была минимальной
Здравствуйте, прошу помочь с одной задачкой, по сути простой, но сложной для меня по реализации и в...

7
Модератор
Эксперт по электронике
8494 / 6320 / 855
Регистрация: 14.02.2011
Сообщений: 21,912
14.12.2013, 19:09 2
читать не удобно пользуйся тегом C++
Цитата Сообщение от _Лето_ Посмотреть сообщение
int B[N],C[N],
в этих массивах мусор
я не вижу где ты их обнуляешь

Добавлено через 1 минуту
Цитата Сообщение от _Лето_ Посмотреть сообщение
for(i>0;i=N-1;i--)
это что?
чем ты инициализируешь переменную цикла
и где условие выхода?
0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.12.2013, 19:17 3

Не по теме:

Цитата Сообщение от _Лето_ Посмотреть сообщение
];}}}}
Программировали бы себе дальше на хаскеле :)



Чтобы создать массив с нулями нужно делать так:
C++
int A[N] = {0};
0
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
14.12.2013, 19:27  [ТС] 4
ValeryS, то есть мне нужно вот так сделать?
C++
1
2
3
int B[N]=0,C[N]=0;
int i,j,t;
int A[]={8,7,7,5,5}; //его тоже нужно изначально обнулить?
а здесь что изменить? Я не совсем понял...

C++
1
for(i>0;i=N-1;i--)
0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
14.12.2013, 19:27 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
 
void PrintArray(const int *arr, int size);
 
 
int main()
{
    const int    N = 5;
    int   arr[N] = {8, 7, 7, 5, 5};
    int    arr1[N] = {},  sum1 = 0;
    int     arr2[N] = {},  sum2 = 0;
 
    for (int i=0, i1=0, i2=0;  i<N;  ++i)
    {
        if (sum1 < sum2)
        {
            arr1[i1++] = arr[i];
            sum1 += arr[i];
        }
        else
        {
            arr2[i2++] = arr[i];
            sum2 += arr[i];
        }
    }
 
    PrintArray(arr, N);
    PrintArray(arr1, N);
    PrintArray(arr2, N);
 
    system("pause");
    return 0;
}
 
 
void PrintArray(const int *arr, int size)
{
    int sum = 0;
 
    for (int i=0; i<size; ++i)
    {
        std::cout << arr[i] << " ";
        sum += arr[i];
    }
    std::cout << "sum = " << sum << std::endl;  // можно убрать
}
1
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
14.12.2013, 19:33  [ТС] 6
_, спасибо огромное
0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
14.12.2013, 19:36 7
_Лето_, у меня немного неправильно. нужно еще добавить сортировку массива

Добавлено через 37 секунд
добавить до цикла for()
0
Модератор
Эксперт по электронике
8494 / 6320 / 855
Регистрация: 14.02.2011
Сообщений: 21,912
14.12.2013, 20:20 8
Цитата Сообщение от _Лето_ Посмотреть сообщение
int B[N]=0,C[N]=0;
нет
тебе programina, показала
Цитата Сообщение от programina Посмотреть сообщение
int A[N] = {0};
Цитата Сообщение от _Лето_ Посмотреть сообщение
int A[]={8,7,7,5,5}; //его тоже нужно изначально обнулить?
зачем ? там лежат твои данные
Цитата Сообщение от _Лето_ Посмотреть сообщение
а здесь что изменить? Я не совсем понял...
проанализируй что ты написал
я мог бы тебе написать правильный вариант
но тогда ты не поймешь ошибку и будешь делать еще и еще раз
у тебя в программе куча for-ов просто сравни
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2013, 20:20

Выбрать три различные точки на плоскости так, чтобы была минимальной разность между количествами точек
Написать программный модуль для решения следующей задачи. Выбрать три различные точки из...

Выбрать три точки из множества точек на плоскости так, чтобы была минимальной разность между количествами точек внутри и вне треугольника
Выбрать три различные точки из заданного множества точек на плоскости так, чтобы была...

Выбрать три различные точки из заданного множества точек на плоскости так, чтобы была минимальной разность между количествами точек, внутри и снаружи.
Написать программный модуль для решения следующей задачи. Выбрать три различные точки из...

Задача. Распределить заказы между предприятиями так, чтобы надежность собираемых из них устройств была наибольшей
Радиотехническое устройство состоит из m блоков. Надежность устройства (время наработки на отказ)...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.