我找到了 3-partition 问题的解决方案,即给定 n 个数字,您确定是否可以形成三个(不相交)子集,使得所有子集都相等(即每个子集的总和等于 n数字/3)。
一个类似的问题是:3-PARTITION 问题。但是,我正在寻找以下代码的解释。
简单地说,我不知道发生了什么。我不知道 T 是什么,i 或 j 是什么,k 是什么,或者为什么我们 k 和 j 从 N 开始并且正在递减,什么 "T[j + C[i]][k] = true; T[j][k + C[i]] = true" 意味着,或者我们为什么要返回 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];
}