非常に単純な質問:
配列を指定して、合計が値 k になるすべてのサブセットを見つけます
私はこれを Java でやろうとしていますが、O(n^2) 時間で解決する解決策を見つけたようです。このソリューションは正しい O(n^2) 実装ですか?
@Test
public void testFindAllSubsets() {
int[] array = {4,6,1,6,2,1,7};
int k=7;
// here the algorithm starts
for(int i = 0; i < array.length;i++){
// now work backwords
int sum = array[i];
List<Integer> subset = new ArrayList<Integer>();
subset.add(array[i]);
for(int j = array.length -1; j > i && sum < k; j--){
int newSum = sum + array[j];
// if the sum is greater, than ditch this subset
if(newSum <= k){
subset.add(array[j]);
sum = newSum;
}
}
// we won't always find a subset, but if we do print it out
if(sum == k){
System.out.print("{");
System.out.print(subset.get(0));
for(int l = 1; l < subset.size(); l++){
System.out.print(","+subset.get(l));
}
System.out.print("}");
System.out.println();
}
}
}
さまざまな例で試してみましたが、壊れているように見えるものは見つかりませんでした。ただし、オンラインで検索したところ、これは問題の一般的な解決策ではないようであり、多くの解決策はこの問題が O(2^n) であると主張しています。
PS これは宿題の質問ではありません。私は、Java で Comp Sci の基礎に取り組もうとしているブログラマーです。ありがとう!