#include <iostream>
#include <algorithm>
using namespace std;
int MAX=20000;
//jakos dziala ale nie zwraca optimum z ilus tam przypadkow
/*int szukaj_min(int N, int tab[], int znak_startu)
{
tab[0]*=znak_startu;
int min=tab[0]; //zawiera kolejne wart_predk
for(int i=0;i<N-1;i++) //szuka minimum
{
if(abs(min-tab[i+1]) >= abs(min+tab[i+1]))
tab[i+1]*=1;
else tab[i+1]*=-1;
min=min+tab[i+1]; //policz akt predkosc
}
return abs(min);
}
*/
void wyp_tab(int **tab, int w, int k)
{
for (int i=0;i<w;i++)
{
for (int j=0;j<k;j++)
{tab[i][j]=MAX;}
}
}
/*void wys_tab(int **tab, int w, int k)
{
for (int i=0;i<w;i++)
{
for (int j=0;j<k;j++)
cout<<tab[i][j]<<" ";
cout<<endl;
}
}
*/
int knapsack_mod(int N, int *W, int p)
{
p++; //zwieksz tak aby miec od 0 do p+1
int min_lokal=MAX;
int **V=new int*[N];
for(int i=0; i<N; i++)
V[i] = new int[p];
wyp_tab(V,N,p);
V[0][W[0]]=W[0];
for (int i=0; i<N-1; i++)
{
for (int w=0; w<p; w++)
{
if(V[i][w]!=MAX)
{
int wart_1=V[i][w]+W[i+1];
if(0<=wart_1 && wart_1 < p)
V[i+1][wart_1]=wart_1;
int wart_2=abs(V[i][w]-W[i+1]);
if(wart_2 < p)
V[i+1][wart_2]=wart_2;
}
}
}
for (int i=0; i<p; i++)
{
if(V[N-1][i]<min_lokal)
min_lokal=V[N-1][i];
}
for(int i=0; i<N; i++)
{delete [] V[i];}
delete [] V;
return min_lokal;
}
int main()
{
int t=0;//ilosc testów
int N=0; //ilosc pomiarow
cin>>t;
for (int j=0; j<t; j++)
{
//int N=(rand()%5000)+1;
int *tab, plecak;
int min_w=MAX;
int max_w=0, max_ww=0;
cin>>N;
tab= new int[N];
for(int k=0;k<N;k++) //zwroci max przy okazji
{
cin>>tab[k];
//tab[k]=(rand()%50)+1;
max_w+=tab[k];
}
sort(tab, tab+N, greater <int>() );
max_ww=max_w;
if (max_w%2!=0)
{max_ww=max_w+1;}
plecak=max(max_ww/2,tab[0]);
min_w=knapsack_mod(N,tab,plecak);
cout<<min_w<<" "<<max_w<<endl;
delete [] tab;
}
//system("pause");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IE1BWD0yMDAwMDsKCi8vamFrb3MgZHppYWxhIGFsZSBuaWUgendyYWNhIG9wdGltdW0geiBpbHVzIHRhbSBwcnp5cGFka293Ci8qaW50IHN6dWthal9taW4oaW50IE4sIGludCB0YWJbXSwgaW50IHpuYWtfc3RhcnR1KQp7CiAgICB0YWJbMF0qPXpuYWtfc3RhcnR1OwogICAgaW50IG1pbj10YWJbMF07ICAgICAgICAgICAgICAgICAgICAgLy96YXdpZXJhIGtvbGVqbmUgd2FydF9wcmVkawogICAgZm9yKGludCBpPTA7aTxOLTE7aSsrKSAgICAgICAgICAgICAgLy9zenVrYSBtaW5pbXVtCiAgICAgICAgewogICAgICAgIGlmKGFicyhtaW4tdGFiW2krMV0pID49IGFicyhtaW4rdGFiW2krMV0pKQogICAgICAgICAgICB0YWJbaSsxXSo9MTsKICAgICAgICAgICAgZWxzZSB0YWJbaSsxXSo9LTE7CiAgICAgICAgbWluPW1pbit0YWJbaSsxXTsgICAgICAgICAgICAgICAgICAvL3BvbGljeiBha3QgcHJlZGtvc2MKICAgICAgICB9CiAgICByZXR1cm4gYWJzKG1pbik7Cn0KKi8KIAp2b2lkIHd5cF90YWIoaW50ICoqdGFiLCBpbnQgdywgaW50IGspCnsKICAgIGZvciAoaW50IGk9MDtpPHc7aSsrKQogICAgICAgIHsKICAgICAgICBmb3IgKGludCBqPTA7ajxrO2orKykKICAgICAgICAgICAge3RhYltpXVtqXT1NQVg7fQogICAgICAgIH0KfQovKnZvaWQgd3lzX3RhYihpbnQgKip0YWIsIGludCB3LCBpbnQgaykKewogICAgZm9yIChpbnQgaT0wO2k8dztpKyspCiAgICB7CiAgICAgICAgZm9yIChpbnQgaj0wO2o8aztqKyspCiAgICAgICAgICAgIGNvdXQ8PHRhYltpXVtqXTw8IiAgICAiOwogICAgICAgIGNvdXQ8PGVuZGw7CiAgICB9Cn0KKi8KCmludCBrbmFwc2Fja19tb2QoaW50IE4sIGludCAqVywgaW50IHApCnsKICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAgICAvL3p3aWVrc3ogdGFrIGFieSBtaWVjIG9kIDAgZG8gcCsxIAogICAgaW50IG1pbl9sb2thbD1NQVg7CiAgICBpbnQgKipWPW5ldyBpbnQqW05dOwogICAgZm9yKGludCBpPTA7IGk8TjsgaSsrKQogICAgICAgIFZbaV0gPSBuZXcgaW50W3BdOwogICAgd3lwX3RhYihWLE4scCk7CiAgICBWWzBdW1dbMF1dPVdbMF07CiAgICBmb3IgKGludCBpPTA7IGk8Ti0xOyBpKyspCiAgICAgICAgewogICAgICAgIGZvciAoaW50IHc9MDsgdzxwOyB3KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgaWYoVltpXVt3XSE9TUFYKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHdhcnRfMT1WW2ldW3ddK1dbaSsxXTsKICAgICAgICAgICAgICAgIGlmKDA8PXdhcnRfMSAmJiB3YXJ0XzEgPCBwKQogICAgICAgICAgICAgICAgICAgIFZbaSsxXVt3YXJ0XzFdPXdhcnRfMTsKICAgICAgICAgICAgICAgIGludCB3YXJ0XzI9YWJzKFZbaV1bd10tV1tpKzFdKTsKICAgICAgICAgICAgICAgIGlmKHdhcnRfMiA8IHApCiAgICAgICAgICAgICAgICAgICAgVltpKzFdW3dhcnRfMl09d2FydF8yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgZm9yIChpbnQgaT0wOyBpPHA7IGkrKykKICAgICAgICB7CiAgICAgICAgaWYoVltOLTFdW2ldPG1pbl9sb2thbCkKICAgICAgICAgICAgbWluX2xva2FsPVZbTi0xXVtpXTsKICAgICAgICB9CiAgICBmb3IoaW50IGk9MDsgaTxOOyBpKyspCiAgICAgICAge2RlbGV0ZSBbXSBWW2ldO30KICAgIGRlbGV0ZSBbXSBWOwogICAgcmV0dXJuIG1pbl9sb2thbDsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgdD0wOy8vaWxvc2MgdGVzdMOzdwogICAgaW50IE49MDsgLy9pbG9zYyBwb21pYXJvdwogICAgY2luPj50OwogICAgZm9yIChpbnQgaj0wOyBqPHQ7IGorKykKICAgICAgICB7CiAgICAgICAgLy9pbnQgTj0ocmFuZCgpJTUwMDApKzE7CiAgICAgICAgaW50ICp0YWIsIHBsZWNhazsKICAgICAgICBpbnQgbWluX3c9TUFYOwogICAgICAgIGludCBtYXhfdz0wLCBtYXhfd3c9MDsKICAgICAgICBjaW4+Pk47CiAgICAgICAgdGFiPSBuZXcgaW50W05dOwogICAgICAgIGZvcihpbnQgaz0wO2s8TjtrKyspICAgICAgICAgICAgICAgIC8vendyb2NpIG1heCBwcnp5IG9rYXpqaQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNpbj4+dGFiW2tdOwogICAgICAgICAgICAvL3RhYltrXT0ocmFuZCgpJTUwKSsxOwogICAgICAgICAgICBtYXhfdys9dGFiW2tdOwogICAgICAgICAgICB9CiAgICAgICAgc29ydCh0YWIsIHRhYitOLCBncmVhdGVyIDxpbnQ+KCkgKTsKICAgICAgICBtYXhfd3c9bWF4X3c7CiAgICAgICAgaWYgKG1heF93JTIhPTApCiAgICAgICAgICAgIHttYXhfd3c9bWF4X3crMTt9CiAgICAgICAgcGxlY2FrPW1heChtYXhfd3cvMix0YWJbMF0pOwogICAgICAgIG1pbl93PWtuYXBzYWNrX21vZChOLHRhYixwbGVjYWspOwogICAgICAgIGNvdXQ8PG1pbl93PDwiICI8PG1heF93PDxlbmRsOwogICAgICAgIGRlbGV0ZSBbXSB0YWI7CiAgICAgICAgfQogICAgLy9zeXN0ZW0oInBhdXNlIik7CiAgICByZXR1cm4gMDsKfQo=