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

Полный перебор - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В целочисленной прямоугольной матрице определить количество строк , не содержащих ни одного элемента http://www.cyberforum.ru/cpp-beginners/thread79940.html
Привет посоветовали ваш форум. Помогите разобраться с массивом . с циклами я кое как разобрался но массивы для меня далеки. Прошу помощи написать 3 задачи. №1 Вычислить произведение в одномерном...
C++ Класс товары. Привет! Народ, помогите с классами на С++. Необходимо написать класс товары с полями наименование товара, дата оформления, цена, количество, номер накладной. И реализовать методы изменения цены,... http://www.cyberforum.ru/cpp-beginners/thread79930.html
C++ Найти все прямоугольные подмассивы в матрице
Как найти все прямоугольные подмассивы в массиве A?
Подскажите в чем косяк? C++
а) Сформировать матрицу А с размерами n x m и присвоить ее элементам значения aij=F(xi, yj), где F(xi,yj)=8,9xiyj+2,3xi2-8xiyj2, xmin≤xi≤xmax, i=1÷n, ymin≤yj≤ymax, j=1÷m. Вводимые данные: xmin,...
C++ отлов буквенной клавиши... http://www.cyberforum.ru/cpp-beginners/thread79917.html
Доброго времени суток! хочу написать программку, но возник вопрос, как отловить нажатие буквенной клавиши, например клавиши с буквой Р, как я посмотрел то виртуальными клавишами тут не обойтись......
C++ Представление n Дано натуральное n. Можно ли представить его в виде суммы трех квадратов натуральных чисел, если млжно, то указать все представления n в виде квадратов натуральных чисел. для примера: пользователь... подробнее

Показать сообщение отдельно
Kissa30rus
0 / 0 / 0
Регистрация: 25.12.2009
Сообщений: 5

Полный перебор - C++

25.12.2009, 23:15. Просмотров 1642. Ответов 1
Метки (Все метки)

Дано множество целых чисел. Требуется разбить множество на две части суммы элементов которых равны. Если нельзя провести разбиение, выдать сообщение об этом.

Помогите пожалуйста... не могу найти ошибку - программа на тестовых значениях ведет себя некорректно..

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//////////////////////////////////////////////////////////////////////
//Лабораторная работа №5;
//Дано множество целых чисел. Требуется разбить множество на две 
//части суммы элементов которых равны. Если нельзя провести разбиение,
//выдать сообщение об этом.
//////////////////////////////////////////////////////////////////////
#include <fstream>
#include <iostream>
// Множество
#include <set>
#include <numeric>
 
using namespace std;
 
//Показывает какие элементы входят в текущую сумму
unsigned char *schetchik;
int kakoi;
 
// Добавляет элемент если в schetchik на месте kakoi стоит 1
int sum(int summa, int chislo)
{
    return schetchik[kakoi++] == 1 ? summa + chislo : summa;
}
 
int main()
{
    set<int,less<int>> mnogestvo;
    ifstream fin("input.txt");
    int n, i, temp, m;
    __int64 chto_nado;
    
    // Количество элементов и какое число надо попробовать получить
    fin >> n;
    fin >> chto_nado;
 
    // Создаем множество и заполняем его
    for (i = 0; i < n; ++i)
    {
        fin >> temp;
        mnogestvo.insert(temp);
    }
 
    m = mnogestvo.size();
    // Создаем счетчик для двоичного перебора и обнуляем его
    schetchik = new unsigned char [m];
    memset(schetchik,0,m);
 
    // Выход будет при обнаружении переполнения счетчика
    while(1)
    {
        ++schetchik[m-1];
        
        // Следит за правильностью двоичног числа
        for (i = m-1; i > 0; --i)
        {
            if (schetchik[i] == 2)
            {
                schetchik[i] = 0;
                ++schetchik[i-1];
            }
            else
            {
                break;
            }
        }
 
        // Перед началом высчета новой сумму, начинаем суммировать то с нулевого элемента
        kakoi = 0;
 
        // Если можно то все
        if (accumulate(mnogestvo.begin(),mnogestvo.end(),0,sum) == chto_nado)
        {
            cout << "Mozno!";
            cout<<endl;
            cout<<"Najmite 0 dlya vixoda...";
            delete [] schetchik;
            cin >> i;
 
            return 0;
        }
 
        if (schetchik[0] == 2)
        {
            break;
        }
    }
    
    delete [] schetchik;
 
    cout << "Nelza!";
    cout<<endl;
    cout<<"Najmite 0 dlya vixoda...";
    cin >> i;
 
    return 1;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru