ありがとう@Scotty、@paddy。参考までに、最適なソリューションは次のとおりです。
void RecSubsets(string soFar, string rest) {
if (rest == "") {
cout << soFar << end;
}
else {
RecSubsets(soFar + rest[0], rest.substr(1));
RecSubsets(soFar, rest.substr(1));
}
}
void CanMakeSum(string set) {
RecSubsets("", set);
}
データを 2 つのセット (C(n-1, k-1) & C(n-1, k)) に分割し、関数を再帰的に呼び出すことにより、セット内のすべての可能な組み合わせを計算する簡単なプログラムを作成しています。以下は私が書いたものです:
void RecSubsets(string soFar, string rest) {
if (rest == "") cout << soFar << end;
}
else {
for (int i = 0; i < rest.length(); i++) {
string next = soFar + rest[i];
string remaining = rest.substr(i+1);
RecSubsets(next, remaining);
}
}
}
void CanMakeSum(string set) {
RecSubsets("", set);
RecSubsets("", set.substr(1));
}
int main() {
string set = "abcd";
CanMakeSum(set);
return 0;
}
したがって、「abcd」の入力文字列の場合、2 つのグループ (abcd と abc) に分割され、関数を再帰的に呼び出して組み合わせを出力します。このロジックでは、出力は abcd、abc、abd、ab、acd、ac、ad、a... のはずですが、上記のプログラムを使用すると、出力は abcd、abd、acd、ad... となります。概念的には私が達成しようとしていることですが、それをコードに変換するのは困難です。誰かが私が間違っているところを指摘できますか? ありがとう