Pagini recente » Cod sursa (job #1702243) | Cod sursa (job #1962164) | Cod sursa (job #1350394) | Cod sursa (job #2108526) | Cod sursa (job #922439)
Cod sursa(job #922439)
#include <fstream>
#define N 75004
#define max(a,b) (((a)>=(b))?(a):(b))
using namespace std;
int sol[N],ult[N],ap[220];
/*
sol[i] = numarul minim de obiecte selectate pentru a obtine suma i
ult[i] = ultimul numar adaugat pentru a obtine suma i
ap[i] = numarul de aparitii a numarului i la citire
*/
int n,G,gmax;
ofstream fout("ghiozdan.out");
void Citire()
{
int i,x;
ifstream fin("ghiozdan.in");
fin>>n>>G;
for(i=1;i<=n;i++)
{
fin>>x;
gmax = max(gmax,x);
ap[x]++;
}
fin.close();
}
void Dinamic()
{
int i,j,k;
sol[0] = 1;//ca sa putem forma mai usor sumele
for(i=gmax;i>0;i--)
if(ap[i])//daca mumarul i apare in vector
for(j=G-i;j>=0;j--)
if(sol[j])//daca putem forma suma j
for(k=1;k<= ap[i] && j+k*i<=G && sol[j+k*i]==0 ;k++)
{
sol[j+k*i] = sol[j]+k;
ult[j+k*i] = i;
}
}
void Afisare()
{
int i;
for(i=G;i>0;i--)
if(sol[i])
{
fout<<i<<" "<<sol[i]-1<<"\n";
while(i)
{
fout<<ult[i]<<"\n";
i = i- ult[i];
}
}
fout.close();
}
int main()
{
Citire();
Dinamic();
Afisare();
return 0;
}