問題は、配列内の数値のサブセットが特定のターゲット番号に加算される回数を見つけることです。パーティション問題の再帰関数
例えば、残りの要素は5まで追加するように設定され{1, 3, 4, 5}
を分割するには、2つの方法があります:
- は
1
と4
- 選択だけ
5
対照的に、セット{1, 3, 4, 5}
を11に分割する方法はありません。
#include "genlib.h"
#include <iostream>
void RecursePart(int[], int, int, int&);
int Wrapper(int[], int, int);
int main() {
int arr[8] = {1,2,3,4,5,6,7,8};
cout << Wrapper(arr, 8, 11);
}
void RecursePart(int arr[], int len, int target, int& ctr) {
if (len == 1) {
if (arr[0] == target) {
ctr++;
}
return;
}
int sum, temp;
sum = temp = arr[0];
for (int j = 1; j < len; j++) {
if (sum == target) {
ctr++;
break;
}
sum = sum + arr[j];
if (sum == target) {
ctr++;
sum = temp;
continue;
}
if (sum > target) {
sum = temp;
continue;
}
if (sum < target) {
temp = sum;
continue;
}
}
RecursePart(arr + 1, len - 1, target, ctr);
}
int Wrapper(int arr[], int len, int target) {
int n = 0;
RecursePart(arr, len, target, n);
return n;
}
問題は、私が得られる出力は1ですが、最大11までの配列の数字のサブセットが1より大きい回数です。アルゴリズムをトレースしようとしましたが、問題はforループ内になければなりません。そこでアルゴリズムはいくつかの合計をスキップします。どうすればこの問題を無効にすることができますか?
宿題?あなたは問題を少し絞り込んで、無関係なコードを含まないプログラムを提示できますか? –
あなたは実際にはパーティション分割していないので、サブセットを選択するだけです。 –
@Tomalak Darn、あなたはコードの書式設定に私を打ち負かしました。 :)(並び替え) –