Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2016, 17:03   #1
Saruman!
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 11
По умолчанию Готовый алгоритм переписать в динамическое программирование(С++)

Код:
#include<iostream>
using namespace std;

void sortarr(int* A,int l, int r)
{
    int x = A[l + (r - l) / 2];
    int i = l;
    int j = r;
    while(i <= j)
    {
        while(A[i] < x) i++;
        while(A[j] > x) j--;
        if(i <= j)
        {
            swap(A[i], A[j]);
            i++;
            j--;
        }
    }
    if (i<r)
        sortarr(A,i, r);

    if (l<j)
        sortarr(A,l, j);
}

int main()
{
    int n,i,j,j1,x,sum=0,sum1=0,m=0,i1=0;
    cin >> n >> x;

    int A[n];
    int B[m];

    for(int i=0;i<n;i++)
        cin >> A[i];

    sortarr(A,0,n-1);

    j=n-1,j1=n-1,i=0;

    while(sum!=x && sum1!=x && j>=0)
    {
        if(A[j]>x)
            j--;
        else
        {
            if(A[j1]+A[i]==x && j1!=i)
                {
                    cout << A[j1] << " " << A[i] << endl;
                    sum1=x;
                }
            else if(A[j1]+A[i]<x)
                    i++;
            else if(A[j1]+A[i]>x)
                    j1--;

            if(sum+A[j]<=x)
                      {
                          B[i1]=A[j];
                          sum+=A[j];
                          j--;
                          m++;
                          i1++;
                      }
            else
                j--;

        }
    }

    if(sum==x)
        {
            for(int i=0;i<m;i++)
                cout << B[i] << " ";
        }

    if(sum==x || sum1==x)
        cout << "YES";
    else
        cout << "NO";
}
Saruman! вне форума Ответить с цитированием
Старый 09.12.2016, 17:44   #2
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Saruman! Посмотреть сообщение
Готовый алгоритм переписать в динамическое программирование(С++)
Код:
1. Во-первых, это не алгоритм, а готовый код на языке ... я бы назвал: какая-то жуткая смесь C и C++ ...
2. В котором никто, если в здравом уме, разбираться не станет...
3. Во-вторых, лучше бы этот "алгоритм" описать словесно, на пальцах: что и из чего вы хотите получить?
4. В-третьих, совершенно непонятно какой смысл вы вкладываете в термин "динамическое программирование" ... да и вообще понимаете ли эти слова?

Слишком много недостающих данных.
olej.tsil вне форума Ответить с цитированием
Старый 09.12.2016, 18:07   #3
Saruman!
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 11
По умолчанию

Условие задачи таково:
Вводится пользователем число x, если сумма элементов массива равна этому числу x, вывести да и числа которые образуют это число. иначе нет.

Пример: Arr{6 1 3 4 8 2 4 5} x= 17

Ответ : Да, 6 3 4 4
Saruman! вне форума Ответить с цитированием
Старый 09.12.2016, 19:36   #4
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Saruman! Посмотреть сообщение
Условие задачи таково:
Вводится пользователем число x, если сумма элементов массива равна этому числу x, вывести да и числа которые образуют это число. иначе нет.

Пример: Arr{6 1 3 4 8 2 4 5} x= 17

Ответ : Да, 6 3 4 4
Ответ неверный!

По вашему примеру условие задачи такое:
- Вводится пользователем число x, если сумма одного или нескольких элементов массива может стать равной этому числу x, вывести "да" и элементы массива, сумма которых образуют это число. иначе "нет".

Решается элементарным рекурсивным перебором элементов массива:
- на каждом уровне рекурсии i (от 0 и далее)
- в цикле добавляем к текущей накопленной сумме поочерёдно все элементы от i+1 до конца...
- если текущая сумма >x - прекращаем поиск по этой ветке рекурсии...
- если текущая сумма <x - продолжаем поиск недостающей части суммы на 1 уровень рекурсии глубже...
- если =x ... я вас поздравляю - вы нашли решение!

Это и есть, наверное, то, что вы называете "динамическое программирование".

Всё это записывается в 10-15 строк кода вместо показанной выше простыни...
olej.tsil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое программирование Hyskills Общие вопросы по Java, Java SE, Kotlin 0 24.02.2016 21:34
переписать готовый алгоритм на VBA mekkanizer Помощь студентам 0 15.04.2012 22:01
Нужно разобрать готовый алгоритм решения задачи в среде Паскаль TaylorGang Помощь студентам 0 14.11.2011 22:17
Динамическое программирование. Алгоритм Нудельмана-Вунша на C++ Dead Romantic Помощь студентам 13 22.05.2010 02:47
Динамическое программирование joey_ramone Паскаль, Turbo Pascal, PascalABC.NET 0 23.04.2010 13:51