Pagini recente » Cod sursa (job #68580) | Cod sursa (job #182193) | Cod sursa (job #504362) | Cod sursa (job #2231336) | Cod sursa (job #1341105)
#include <iostream>
#include <fstream>
#define Max_N 20000
#define Max_G 75000
using namespace std;
int n,gmax,T[Max_G],C[Max_G],O[Max_N];
bool G[Max_G];
ofstream out("ghiozdan.out");
void citire()
{
ifstream in("ghiozdan.in");
in>>n>>gmax;
for(int i = 1 ; i <= n ; i++)
in>>O[i];
}
void quickSort(int left, int right) {
int i = left, j = right;
int tmp;
int pivot = O[(left + right) / 2];
while (i <= j) {
while (O[i] < pivot)
i++;
while (O[j] > pivot)
j--;
if (i <= j) {
tmp = O[i];
O[i] = O[j];
O[j] = tmp;
i++;
j--;
}
};
if (left < j)
quickSort(left, j);
if (i < right)
quickSort(i, right);
}
void dinmica()
{
G[0] = true;
for(int i = n ; i >= 1 ; i --)
{
for(int j = gmax; j >= 0 ; j--)
if(G[j]==true) {
if((G[j+O[i]]==false)||((C[j+O[i]]>C[j]+1)&&(T[j+O[i]+O[i]]!=O[i]))) {
T[j+O[i]]=O[i];
G[j+O[i]]=true;
C[j+O[i]]=C[j]+1;
}
}
}
}
void afisare()
{
bool ok = false;
gmax++;
do{
if(G[gmax-1]) ok = true;
gmax--;
}while(!ok);
out<<gmax<<' '<<C[gmax]<<'\n';
while(gmax>0)
{
out<<T[gmax];
out<<'\n';
gmax-=T[gmax];
}
}
int main()
{
citire();
quickSort(1,n);
dinmica();
afisare();
return 0;
}