Я только что начал изучать алгоритмы Backtracking
в колледже. Как-то мне удалось создать программу для проблемы Subset-Sum. Прекрасно работает, но потом я обнаружил, что моя программа не дает всех возможных комбинаций.Понимание суммы подмножеств
Например: может быть сто комбинаций целевой суммы, но моя программа дает только 30. Вот код. Было бы очень полезно, если бы кто-нибудь мог указать, что моя ошибка.
int tot=0;//tot is the total sum of all the numbers in the set.
int prob[500], d, s[100], top = -1, n; // n = number of elements in the set. prob[i] is the array with the set.
void subset()
{
int i=0,sum=0; //sum - being updated at every iteration and check if it matches 'd'
while(i<n)
{
if((sum+prob[i] <= d)&&(prob[i] <= d))
{
s[++top] = i;
sum+=prob[i];
}
if(sum == d) // d is the target sum
{
show(); // this function just displays the integer array 's'
top = -1; // top points to the recent number added to the int array 's'
i = s[top+1];
sum = 0;
}
i++;
while(i == n && top!=-1)
{
sum-=prob[s[top]];
i = s[top--]+1;
}
}
}
int main()
{
cout<<"Enter number of elements : ";cin>>n;
cout<<"Enter required sum : ";cin>>d;
cout<<"Enter SET :\n";
for(int i=0;i<n;i++)
{
cin>>prob[i];
tot+=prob[i];
}
if(d <= tot)
{
subset();
}
return 0;
}
Когда я запускаю программу:
Enter number of elements : 7
Enter the required sum : 12
Enter SET :
4 3 2 6 8 12 21
SOLUTION 1 : 4, 2, 6
SOLUTION 2 : 12
Хотя 4, 8 также является решением, моя программа не показывает его. Его еще хуже с количеством входов как 100 или более. Там будет зарегистрировано не менее 10000 комбинаций, но моя программа показывает 100.
Логика, которую я пытаюсь следовать:
- Возьмите в элементах основного SET в подмножество тех пор, пока сумма подмножество остается меньше или равно целевой сумме.
- Если добавление определенного числа к сумме подмножества делает его больше, чем цель, оно не принимает его.
- Как только он дойдет до конца комплекта, ответ не найден, он удаляет самое последнеенедавно принятое число из набора и начинает смотреть на цифры в позиции после удаления последнего номера. (с тех пор, как я храню в массиве '', это позиции выбранных номеров из основного SET).
Это помогло бы, если бы у ваших переменных были более описательные имена (это будет полезно для вашей карьеры программирования вообще), или, по крайней мере, если вы сказали нам, что каждый из них должен означать, как они объявлены, инициализированы и т. Д. . – Angew
Можете ли вы добавить пример ввода, то, что вы ожидали от вывода, и каков был результат. Не совсем ясно, как этот код * дает * что угодно, или откуда он получает вход. – john
Жаль, что вы так расплывчаты. Это первый раз, когда я отправляю код в Интернете. – thekeystroker