Pagini recente » Cod sursa (job #1083130) | Cod sursa (job #62375) | Cod sursa (job #793289) | Cod sursa (job #298389) | Cod sursa (job #1109896)
#include<fstream>
#include<vector>
#include<bitset>
#define NMAX 205
#define GMAX 75005
#define Min min(j/i,v[i])
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
struct obiect
{
int greutate,nr,valmax;
bitset<NMAX> use;
obiect()
{
greutate=nr=valmax=0;
}
}DP[2][GMAX];
int n,g,v[NMAX];
vector<int> sol;
int main()
{
fin>>n>>g;
for(int i=1,x;i<=n;i++)
{
fin>>x;
v[x]++;
}
int l=0;
for(int i=1;i<=200;i++)
{
if(!v[i])
continue;
for(int j=0;j<=g;j++)
{
DP[1-l][j]=DP[l][j];
if(DP[l][j-Min*i].greutate+Min*i==DP[1-l][j].greutate)
DP[1-l][j].nr=min(DP[1-l][j].nr,DP[l][j-Min*i].nr+Min);
if(DP[l][j-Min*i].greutate+Min*i>DP[1-l][j].greutate)
{
DP[1-l][j]=DP[l][j-Min*i];
DP[1-l][j].greutate+=Min*i;
DP[1-l][j].nr+=Min;
DP[1-l][j].valmax=i;
}
}
l=1-l;
}
fout<<DP[l][g].greutate<<' '<<DP[l][g].nr<<'\n';
for(int i=DP[l][g].valmax,val=DP[l][g].greutate;i;i--)
while(i<=val && v[i]--)
{
sol.push_back(i);
val-=i;
}
for(int i=sol.size()-1;i>=0;i--)
fout<<sol[i]<<'\n';
return 0;
}