#include <algorithm>
#include <vector>
#include <fstream>
#include <limits>
using namespace std;
class Application
{
public:
Application(int argc, char** argv)
{
}
void Run()
{
vector<int> stones = GetDataFromFile("INPUT.TXT");
ofstream oFile("OUTPUT.TXT", ios::trunc);
oFile << Dissolve(stones);
oFile.close();
}
vector<int> GetDataFromFile(const char* fileName)
{
vector<int> stones;
ifstream iFile(fileName);
if (iFile.fail())
{
// return empty array if file reading fails.
return stones;
}
int N, weight;
iFile >> N;
for (int i = 0; i<N; ++i)
{
iFile >> weight;
stones.push_back(weight);
}
iFile.close();
return stones;
}
int Dissolve(const vector<int> stones)
{
int mindelta = numeric_limits<int>::max();
// bruteforce
DissolveRecursive(stones, 0, stones.size(), 0, 0, mindelta);
return mindelta;
}
void DissolveRecursive(const vector<int>& stones, int i, int N,
int wheap1, int wheap2, int& mindelta)
{
if (i == N)
{
mindelta = min(abs(wheap1 - wheap2), mindelta);
return;
}
DissolveRecursive(stones, i + 1, N, wheap1 + stones[i], wheap2, mindelta);
DissolveRecursive(stones, i + 1, N, wheap1, wheap2 + stones[i], mindelta);
}
};
void main(int argc, char** argv)
{
Application app(argc, argv);
app.Run();
}
#include <fstream>
#include <algorithm>
using namespace std;
class Found:exception{};
int minDiff,target,Count,*Heap;
void solve(int start,int diff)
{
int adiff=abs(diff);
if(adiff<minDiff)minDiff=adiff;
if(adiff==target)throw Found();
if(diff<0)return;
for(int i=start;i<Count;i++)solve(i+1,diff-Heap[i]*2);
}
int calc()
{
sort(Heap,Heap+Count);
target=minDiff%2;
try
{
solve(0,minDiff);
}
catch (Found){}
return minDiff;
}
int main()
{
ifstream in("INPUT.TXT");
ofstream out("OUTPUT.TXT");
in>>Count;
Heap=new int[Count];
for(int i=0;i<Count;i++)
{
int t;
in>>t;
minDiff+=Heap[i]=t;
}
out<<calc()<<endl;
delete []Heap;
return 0;
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.