Условие:
Дана последовательность из N целых чисел. Найдите любую из ее подпоследовательностей, сумма элементов которой равна w, либо установите, что искомой подпоследовательности не существует. 
Формат входного файла:
Во входном файле находятся числа N и w, а за ними следует последовательность из N целых чисел ai.
Формат выходного файла:
Если искомая подпоследовательность существует, выведите N чисел 0 или 1, разделенных пробелами. Единица на позиции i означает, что элемент последовательности ai принадлежит найденной подпоследовательности, 0 означает обратное. В противном случае выведите −1.
Ограничения:
1 ≤ N ≤ 40, 0 ≤ ai,w ≤ 10000000 
Помогите исправить ошибку в восстановлении ответа.
Вот код:
#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;
        }
        
}