Количество подмножеств проблемы, как отлаживать там, где решение не работает?

#algorithm #recursion #dynamic-programming

Вопрос:

Поэтому я пытаюсь решить эту проблему :

Учитывая массив arr[] целых чисел и целочисленную сумму, задача состоит в том, чтобы подсчитать все подмножества данного массива с суммой, равной заданной сумме.

Примечание: Ответ может быть очень большим, поэтому выведите ответ по модулю 10^9 7

Теперь это решение, которое я здесь опробую:

 class Solution{
    private:
    vector<vector<int>> t;
    public:
    Solution() {
        t.resize(1001, vector<int> (1001,-1));
    }
    int perfectSum(int arr[], int n, int sum)
    {  
        long long int result = fmod(sumrecursive(arr, n, sum),(pow(10,9) 7));
        return resu<
    }
    
    long long int sumrecursive(int arr[], int n, int sum){
        
        if(sum==0){
            return 1;
        } 
        if(n==0){
            return 0;
        }
        
        if(t[n][sum] != -1){
            return t[n][sum];
        }
        
        if(arr[n-1]>sum){
            return t[n][sum] = sumrecursive(arr, n-1, sum);
        } else {
            return t[n][sum] = sumrecursive(arr,n-1, sum-arr[n-1])   sumrecursive(arr, n-1, sum);
        }
    }
      
};
 

Теперь этот код не работает после некоторого определенного ввода:

введите описание изображения здесь

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

Комментарии:

1. Вы уверены, что не переполняете свои возвращаемые или кэшированные значения? Трудно сказать, не видя заданного ввода, но вы используете вектор int для кэширования результата типа long long int. Увидеть воспроизводимый пример помогло бы.

Ответ №1:

Вероятно, вы сталкиваетесь с переполнением целых чисел по пути.

Вы используете мод только непосредственно перед завершением функции, но ваш кэш имеет тип int , поэтому при размещении слишком больших чисел вы теряете некоторые данные из — за переполнения.

Комментарии:

1. Да, я верю, что это тоже так. У вас есть идея, как я могу решить эту проблему переполнения?

2. @Nike Выполняйте модуляцию раньше, когда вы подводите итоги.