これは宿題ではありません。学校に行くお金がないので、高速道路の料金所でシフトを組みながら独学しています (顧客が少ない長い夜)。
整数の配列を指定すると、その合計が目的の合計に等しいサブセットを返し、それを見つけるのにかかった呼び出しの数を報告する単純なサブセット合計アルゴリズムを実装しようとしています。
コレクションを使用してJavaで実装しましたが、すべてのセットを合計して目的の数に戻すことができたとしても、最初の一致で停止するかどうかを関数に指示できたとしても、それは非常に肥大化したコードでした。
このコードで私が抱えている問題は次のとおりです: 2^n 時間で実行するのではなく (結果が見つからない場合、そのような実装では正しいですよね?)、[2^(n+1)] で実行されます。 1回; コメントで指摘された O(2^n) 。(runningTotal == targetTotal) を自分でチェックできるよりも深いレベルでチェックし、本質的に自分で余分な深さを追加する理由がわかりますね。基本ケースをできるだけきれいにモデル化しようとしていましたが、「コードのにおい」を検出した場合はお知らせください。(runningTotal + think) == targetTotal が表示されたらすぐに中断する必要がありますか?
注:全体的なアプローチではなく、特定のコード行について質問しているため、これは「コードレビュー」に属しているとは思いません(アプローチを変更する必要がある場合は、学習するためにこれを行っています)。
ここで私の試み(上記の最適化の欠如を除けば、これは「通用する」C / C ++ですか?):
#include <iostream>
using namespace std;
bool setTotalling(int chooseFrom[], int nChoices, int targetTotal,
int chooseIndex, int runningTotal, int solutionSet[], int &solutionDigits,
int &nIterations) {
nIterations++;
if (runningTotal == targetTotal) {
return true;
}
if (chooseIndex >= nChoices) {
return false;
}
int consider = chooseFrom[chooseIndex];
if (setTotalling(chooseFrom, nChoices, targetTotal, chooseIndex + 1,
runningTotal + consider, solutionSet, solutionDigits, nIterations)) {
solutionSet[solutionDigits++] = consider;
return true;
}
if (setTotalling(chooseFrom, nChoices, targetTotal, chooseIndex + 1,
runningTotal, solutionSet, solutionDigits, nIterations)) {
return true;
}
return false;
}
void testSetTotalling() {
int chooseFrom[] = { 1, 2, 5, 9, 10 };
int nChoices = 5;
int targetTotal = 23;
int chooseIndex = 0;
int runningTotal = 0;
int solutionSet[] = { 0, 0, 0, 0, 0 };
int solutionDigits = 0;
int nIterations = 0;
cout << "Looking for a set of numbers totalling" << endl << "--> "
<< targetTotal << endl << "choosing from these:" << endl;
for (int i = 0; i < nChoices; i++) {
int n = chooseFrom[i];
cout << n << ", ";
}
cout << endl << endl;
bool setExists = setTotalling(chooseFrom, nChoices, targetTotal, chooseIndex,
runningTotal, solutionSet, solutionDigits, nIterations);
if (setExists) {
cout << "Found:" << endl;
for (int i = 0; i < solutionDigits; i++) {
int n = solutionSet[i];
cout << n << ", ";
}
cout << endl;
} else {
cout << "Not found." << endl;
}
cout << "Iterations: " << nIterations << endl;
}
int main() {
testSetTotalling();
return 0;
}