這是子集求和問題的解決方案。它使用回溯。我一直在想這個問題超過2個小時,而我卻無法理解它。子集的這個解決方案如何總結問題的工作?
編輯:我已經添加了一些基於我所瞭解的代碼的意見。如果我錯了,請糾正我。
#include <iostream>
int n, d, w[10], x[10], count=0;
void subset(int cs, int k, int r)//i dont understand the purpose of cs or of the array x[]
{
int i;
x[k] = 1;
if(cs + w[k] == d) //if the first element is equivalent to the sum that is required
{
std::cout<< "\n\nSolution " << ++count << " is:";
for(i=0; i<=k; i++) // so if the subset criteria are met then the array is printed.
if(x[i] == 1)
std::cout << w[i] << " ";
}
else if(cs + w[k] + w[k+1] <= d) //if the node is promising then go to the next node and
subset(cs + w[k], k+1, r - w[k]); //check if subset criteria are met
if(cs + w[k+1] <= d && cs + r - w[k] >= d) //else backtrack
{
x[k] = 0;
subset(cs, k+1, r-w[k]);
}
}
int main()
{
int sum=0, i;
std::cout << "enter n\n";
std::cin >> n;
std::cout < <"enter " << n << " elements\n";
for(i=0; i<n; i++)
std::cin >> w[i];
for(i=0; i<n; i++)
sum += w[i];
std::cout << "enter value of sum\n";
std::cin >> d;
if(sum < d)
std::cout<<"INVALID SOLUTION\n";
else
subset(0,0,sum);
}
注意:這是一個工作解決方案。它使用g ++編譯時工作。我很抱歉,如果這看起來太討厭,但我只是不太瞭解代碼,因此我不能給出太多的解釋。
爲什麼不給你發佈的代碼添加一些評論,並附上你對你理解的部分的想法以及你不瞭解的部分亮點? –
如果您完全陷入困境,請使用調試器逐步執行一些簡單的示例。檢查變量,看看發生了什麼。 – reima
@JohnZwinck我已添加評論。如果我錯了,請糾正它們。 –