問題是要找出數組中某個子集的數量合計到特定目標數量的次數。分區問題的遞歸函數
例如,有兩種方式,使剩餘的元素加起來5集合進行分區{1, 3, 4, 5}
:
- 選擇
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達恩,你打敗了我的代碼格式。 :)(Sort of。) –