неправильная сумма подмножества в O (n ^ 2)

Я знаю, что этот код / ​​логика неверен для решения проблемы суммы подмножества, но не могу понять, почему.

Вычислите сумму всех возможных подмножеств и проверьте, равна ли какая-либо требуемая сумма. Это будет сделано за O (n ^ 2), что, очевидно, неверно, поскольку я могу решить это через DP O (n * sum).

Спасибо.

int main() {
    long long int t,n,i,j;
    scanf("%lld",&t);
    while(t--)
    {   
        long long int p[1005][1005],s[1005][1005]={0};
        long long int a[1005],sum;
        long long int counter=0;
        scanf("%lld %lld",&n,&sum);
        for(i=0;i<n;i++)
            scanf("%lld",&a[i]);
        s[0][0]=a[0];
        for(i=0;i<n;i++)
        {   
            for(j=i;j<n;j++)
            {
                if(i==j)
                {
                    s[i][j]=a[i];
                }
                else
                {
                    s[i][j]=a[j]+s[i][j-1];
                }
            }
        }
        int flag=0;
        for(i=0;i<n;i++)
        {
            for(j=i;j<n;j++)
            {
                if(s[i][j]==sum)
                    flag++;
            }
        }
        if(flag)
            cout<<1<<endl;
        else
            cout<<0<<endl;

    }
    return 0;
}  

person someone1    schedule 21.12.2015    source источник
comment
Кроме того, сумма подмножества является NP полной. Если вы сможете решить все задачи быстрее, чем экспоненциально, то выиграете всевозможные призы.   -  person AndyG    schedule 21.12.2015
comment
Я знаю, что это неправильно, я просто прошу ошибиться в логике.   -  person someone1    schedule 21.12.2015
comment
Вы читали en.wikipedia.org/wiki/Subset_sum_problem?   -  person 4386427    schedule 21.12.2015
comment
Я добавил код. Я неправильно истолковал проблему, просто пытаюсь понять ошибку. Я знаю о проблеме и о том, что она NP-полная, и о том, как это сделать с помощью рекурсии и DP. Просто случайное сомнение у меня было.   -  person someone1    schedule 21.12.2015
comment
В чем именно заключается вопрос? Результат реализации отличается от ожидаемого или неясно, как ограничить время выполнения?   -  person Codor    schedule 21.12.2015
comment
По логике, я вычисляю сумму всех возможных подмножеств, а затем сравниваю и проверяю, равно ли какое-либо подмножество требуемой сумме. Когда я запускаю это с некоторыми случайными тестами, он отлично работает, когда я отправлял его на практическую задачу на codechef, он получил WA. Поскольку я думаю, что время работы будет O (n ^ 2) (довольно ново для нотации Big O), и проблема, очевидно, завершена NP, поэтому я знаю, что мое решение неверно. Мне интересно, где же ошибка. Возможно, тестовый пример, для которого это не удается?   -  person someone1    schedule 21.12.2015
comment
Каково точное значение s [i] [j]?   -  person notbad    schedule 21.12.2015


Ответы (2)


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

См. https://en.wikipedia.org/wiki/Subset_sum_problem

person 4386427    schedule 21.12.2015
comment
Спасибо! Возможный тестовый пример, для которого это не удастся, чтобы я мог лучше понять? - person someone1; 21.12.2015
comment
@ something1 - есть 2 ^ N подмножеств - вы вычисляете только N ^ 2 подмножеств. Пример: предположим, что N = 20. Где вычислить сумму подмножества, состоящего из элементов с номерами 2, 3, 5, 7, 11, 13, 17 и 19? Вы этого не сделаете. - person 4386427; 21.12.2015
comment
Ах! Большое спасибо. Я только что осознал проблему, которую решил для упомянутых подмассивов, поэтому я рассчитал только непрерывные подмножества! Большое спасибо, очень глупый вопрос, я должен был попробовать еще немного сам. Извините за неприятности. - person someone1; 21.12.2015

Проблема в том, что s[i][j] просто записывает a[i]+a[i+1]+...+a[j]. Фактически, вам нужно записать суммы для всех подмножеств a[i...j], которые должны быть 2^(j-i). Ваш код должен легко потерпеть неудачу, если ваша целевая сумма не является суммой непрерывного подмножества.

person notbad    schedule 21.12.2015