Pagini recente » Cod sursa (job #2879470) | Cod sursa (job #2516113) | Cod sursa (job #2983027) | Cod sursa (job #1821402) | Cod sursa (job #998842)
Cod sursa(job #998842)
#include <fstream>
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
#define inf 20001
int i,n,g,nr[201],s[75001],ob[75001],x,j,maxw,G,current[75001];
/*nr[i]=numarul de obiecte de greutate i
(deoarece intervalul de greutati este mult mai mic decat numarul maxim de obiecte
iar un obiect este identificat numai prin greutatea sa, aceasta reprezentare este mult mai avantajoasa
s[i]=numarul minim de obiecte ce pot forma greutatea i
ob[i]= ultimul obiect ce a intrat in compopnenta greutatii i*/
int main ()
{
fin>>n>>G;
maxw=0;
for (i=1;i<=n;i++)
{
fin>>x;
nr[x]++;
if (x>maxw) maxw=x;
}
s[0]=1;
for (int w=maxw; w>=1; w--)
{
if (nr[w]==0) continue;
for (int i=0; i<=G; ++i) current[i]=0;
for (i=0; i<=G-w; ++i)
{
if (current[i]+1 > nr[w]) continue;
if (s[i] && !s[i+w])
{
s[i+w] = s[i]+1;
current[i+w]= current[i]+1;
ob[i+w] = w;
}
}
}
for (i=G;;i--) if (s[i]) {fout<<i<<" "<<s[i]-1<<"\n"; break;}
while (i)
{
fout<<ob[i]<<"\n";
i=i-ob[i];
}
}