3 개의 파티션 문제에 대한 해결책을 찾았습니다. 즉, n 개의 숫자가 주어지면 3 개의 (결합 해제) 하위 세트를 구성하여 equal (즉, 각 부분 집합은 n 개의 숫자 합계/3과 같은 합계를가집니다).동적 프로그램을 사용하여 n 개의 숫자가 주어진 3 개의 파티션이 있는지 확인하십시오.
비슷한 질문은 3-PARTITION problem입니다. 그러나 아래 코드에 대한 설명을 찾고 있습니다.
간단히 말해서, 나는 무슨 일이 일어나고 있는지 전혀 모른다. 나는 T가 무엇인지, i 또는 j가 무엇인지, 어떤 k인지, 또는 왜 우리가 k에서 시작하여 N에서 시작하여 감소되고 있는지, T [j + C [i]] [k] = 참인지를 모른다. T [j] [k + C [i]] = 참 의미는, 왜 T [N/3]을 돌려 주는가?
bool T[10240][10000];
bool partition(vector<int> C) {
// compute the total sum
int n = C.size();
int N = 0;
for(int i = 0; i < n; i++) N += C[i];
// initialize the table
T[0][0] = true;
memset(T, 0, 10000^2);
// process the numbers one by one
for(int i = 0; i < n; i++) {
for (int j = N; j >= 0; --j) {
for (int k = N; k >= 0; --k) {
if (T[j][k]) {
T[j + C[i]][k] = true;
T[j][k + C[i]] = true;
}
}
}
}
return T[N/3];
}
잘못된 코드입니다. –