저는 대학에서 알고리즘을 Backtracking
학습하기 시작했습니다. 어쨌든 Subset-Sum 문제에 대한 프로그램을 만들었습니다. 잘 작동하지만 그 다음 내 프로그램 이 가능한 모든 조합을 알려주지 않는다는 것을 발견했습니다.서브 세트의 합계를 이해하십시오.
예 : 대상 합계에 100 가지 조합이 있지만 프로그램에서 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;
}
내가 프로그램을 실행하면 : 8도 솔루션입니다
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 만을, 내 프로그램을 보여 나던. 입력 수가 100 개 이상인 경우가 훨씬 더 나쁩니다. 이이어야 10000 개 조합,하지만 내 프로그램은 100
내가 따라하려고 로직 표시됩니다의 합만큼 주요 SET의 요소
- 테이크를 하위 집합으로 부분 집합은 목표 합계보다 작거나 같습니다.
- 서브 세트 sum에 특정 숫자를 더하면 목표보다 더 큰 숫자가 이됩니다.
- 집합의 끝에 에 도달하고 대답을 찾지 못하면 최근에 찍은 숫자가 집합에서 제거되고 최근 번호가 제거 된 위치의 숫자 이 시작됩니다. (배열의 's'에 저장 한 값은 의 기본 SET에서 선택된 숫자의 위치입니다.) 때문에 당신이만큼 그들은 '돈으로 항목을 경우 1 단계
에 "만큼"절에
변수에 더 많은 설명이 포함 된 이름을 사용하면 도움이됩니다 (프로그래밍 경력에 유용 할 것입니다). 또는 적어도 각각의 의미가 무엇인지, 선언 된 방식, 초기화 된 방식 등을 알려 주시면 도움이됩니다. – Angew
몇 가지 예제 입력을 추가 할 수 있습니까? 출력 예상되는 내용과 출력 내용을 추가 할 수 있습니까? 이 코드가 어떤 것을 제공하는지, 어디서부터 정보를 얻을 수 있는지는 명확하지 않습니다. – john
너무 모호해해서 죄송합니다. 온라인으로 코드를 게시하는 것은 이번이 처음입니다. – thekeystroker