Backtracking
大学でアルゴリズムを学び始めたばかりです。どういうわけか、部分和問題のプログラムを作成することができました。正常に動作しますが、プログラムがすべての可能な組み合わせを提供していないことがわかりました。
例:目標の合計には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;
}
プログラムを実行すると:
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 の要素をサブセットに取り込みます。
- サブセットの合計に特定の数を追加すると、それがターゲットよりも大きくなる場合、それは取りません。
- セットの最後に到達し、答えが見つからない場合、セットから最後に取得された番号を削除し、削除された最近の番号の位置の後の位置にある番号を調べ始めます。(配列「s」に保存するのは、メインSETから選択した番号の位置であるため)。