#include #include #include #include #include #include #include using namespace std; int numbers[256]; bool sums[256* 128]; bool used[256 * 128][128]; bool taken[128]; int n, m, d, minval = -1, sum, product, takenCount; vector arrA; ifstream in("product.in"); ofstream out("product.out"); void getBestSum(int sum, int curInd, int takenCount){ if (sum == 0){ out << " " << takenCount << " " << n - takenCount << endl; for (int ind = 0; ind < n; ind++){ if (taken[ind] == true){ out << numbers[ind] << " "; } } out << endl; for (int ind = 0; ind < n; ind++){ if (taken[ind] == false){ out << numbers[ind] << " "; } } out << endl; exit(0); } else{ while (used[sum][curInd] == false){ curInd--; if (curInd < 0){ return; } } taken[curInd] = true; getBestSum(sum - numbers[curInd], curInd - 1, takenCount + 1); taken[curInd] = false; } } int main(){ in >> n; for (int ind = 0; ind < n; ind++){ in >> numbers[ind]; } sort(numbers, numbers + n); for (int ind = 0; ind < n; ind++){ sum += numbers[ind]; } sums[0] = true; for (int i = 0; i < n; i++){ for (int j = sum - numbers[i]; j >= 0; j--){ if (sums[j - numbers[i]] == true){ sums[j] = true; used[j][i] = true; } } } int sumInd; for (int ind = int(ceil(sum / 2.0)); ind <= sum; ind++){ if (sums[ind] == true){ sumInd = ind; out<< ind * (sum - ind); break; } } getBestSum(sumInd, n - 1, 0); }