Pagini recente » Cod sursa (job #1978849) | Cod sursa (job #2155122) | Cod sursa (job #472507) | Cod sursa (job #114326) | Cod sursa (job #48837)
Cod sursa(job #48837)
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
inline bool invcmp(long int a,long int b)
{
return (a>b);
}
int main(void)
{
int n;
long int g;
vector<long int> G;
vector<int> S1;
vector<int> S2;
long int x;
int i;
long int gmax;
FILE *f;
//citeste datele de intrare
f=fopen("ghiozdan.in","rt");
fscanf(f,"%d %ld",&n,&g);
for(i=0;i<n;i++)
{
fscanf(f,"%ld",&x);
G.push_back(x);
}
fclose(f);
//sorteaza invers
sort(G.begin(),G.end(),invcmp);
//face vectorii
for(i=0;i<=g;i++)
{
S1.push_back(0);
S2.push_back(0);
}
S1[0]=0;
gmax=0;
for(i=0;i<n;i++) //pt fiecare obiect
{
for(x=0;((x<=gmax)&&(x<=g));x++)
if((S1[x]!=0)||(x==0)) //daca s-a obtinut deja greutatea x atunci
//se poate obtine si x+G[i]
{
if((S1[x]+1<S1[x+G[i]])||(S1[x+G[i]]==0)) //daca x+G[i] se obtine intro varianta
//mai buna atunci memoreaza atlfel nu are rost sau daca nu s-a obitnut deloc
if((S1[x]+1<S2[x+G[i]])||(S2[x+G[i]]==0))
S2[x+G[i]]=S1[x]+1;
if(x+G[i]>gmax)
gmax=x+G[i];
}
//afiseaza
// cout<<endl;
// for(x=0;x<=gmax;x++)
// cout<<S1[x]<<" ";
// cout<<endl;
// for(x=0;x<=gmax;x++)
// cout<<S2[x]<<" ";
// cin>>x;
//copiaza vectorii
for(x=0;((x<=gmax)&&(x<=g));x++)
if(((S1[x]>S2[x])||(S1[x]==0))&&(S2[x]!=0))
{
S1[x]=S2[x];
S2[x]=0;
}
}
//afiseaza solutia
x=g;
while(S1[x]==0)
{
x-=1;
}
//scrie
f=fopen("ghiozdan.out","wt");
fprintf(f,"%ld %d",x,S1[x]);
fclose(f);
//sf
return 0;
};