2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Subset sum problem knapsack
Сообщение19.05.2013, 10:12 


06/08/12
16
Условие:
Дана последовательность из N целых чисел. Найдите любую из ее подпоследовательностей, сумма элементов которой равна w, либо установите, что искомой подпоследовательности не существует.

Формат входного файла:
Во входном файле находятся числа N и w, а за ними следует последовательность из N целых чисел ai.
Формат выходного файла:
Если искомая подпоследовательность существует, выведите N чисел 0 или 1, разделенных пробелами. Единица на позиции i означает, что элемент последовательности ai принадлежит найденной подпоследовательности, 0 означает обратное. В противном случае выведите −1.
Ограничения:
1 ≤ N ≤ 40, 0 ≤ ai,w ≤ 10000000

Помогите исправить ошибку в восстановлении ответа.
Вот код:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>

using namespace std;

int n,w,i,j;

ofstream fo("output.txt");
ifstream fi("input.txt");

int main (){

        fi >> n >> w;  
       
        int* A = (int*)malloc(sizeof(int)*(n+1));
        int* B = (int*)malloc(sizeof(int)*(n+1));      
        int* S = (int*)malloc(sizeof(int)*(w+1));
       
        for (i = 1; i <= n; i ++)
                fi >> A[i];
       
        S[0] = 1;

        for (j = 1; j <= w; j ++)
                S[j] = 0;
               
                for (i = 1; i <= n; i ++){
                        for (j = w; j >= A[i]; --j){
                        S[j] |= S[j - A[i]];
                }
               
        }

        j = w;
        if(S[w]){
        for (i = n; i >= 1; i --){
                if (j > A[i]){         
                        B[i] = 1;
                        j -= A[i];
                } else {
                        B[i] = 0;
                }
        }
        for(i = 1; i <= n; i++)
                fo << B[i] << " ";
        } else {
                fo << -1;
        }
       
}
 

 Профиль  
                  
 
 Re: Subset sum problem knapsack
Сообщение19.05.2013, 17:25 
Заслуженный участник


04/05/09
4587
При восстановлении первое попавшееся число брать нельзя. Надо при получении сумм записывать в S не 1, а индекс числа, которое привело к этой сумме. Потом использовать эти индексы.

 Профиль  
                  
 
 Re: Subset sum problem knapsack
Сообщение19.05.2013, 17:36 


06/08/12
16
Извените, если не трудно, то напишите пожалуйста код

 Профиль  
                  
 
 Re: Subset sum problem knapsack
Сообщение19.05.2013, 20:54 
Заслуженный участник


04/05/09
4587
Здесь так не принято.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group