Pagini recente » Cod sursa (job #57244) | Cod sursa (job #2738385) | Rating Dimitar Oparlakov (dimitar_oparlakov) | Cod sursa (job #1301338) | Cod sursa (job #18641)
Cod sursa(job #18641)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxN 20010
#define maxG 75010
int n,g,vec[maxN],din[maxG],his[maxG],viz[maxN],gmax,nmin,kviz;
void inputFunc(){
FILE*fi=fopen("ghiozdan.in","r");
fscanf(fi,"%d %d",&n,&g);
for(int i=0;i<n;i++){
fscanf(fi,"%d",vec+i);
}
fclose(fi);
}
void outputFunc(){
FILE*fi=fopen("ghiozdan.out","w");
fprintf(fi,"%d %d\n",gmax,nmin);
for(int i=0;i<nmin;i++)fprintf(fi,"%d\n",viz[i]);
fclose(fi);
}
void dfunc(int gm,int k){
memset(din,0,(gm+1)*4);memset(his,0,(gm+1)*4);
for(int i=0;i<n;i++){
int c=vec[i];
for(int j=gm-c;j>0;j--)if(din[j]){
if(din[j]+1 < din[j+c] || !din[j+c])din[j+c]=din[j]+1,his[j+c]=j;
}
din[c]=1;his[c]=0;
if(din[gm]==k)break;
}
}
int main(){
inputFunc();
for(int i=0;i<n;i++){
int c=vec[i];
for(int j=g-c;j>0;j--)if(din[j]){
if(din[j]+1 < din[j+c] || !din[j+c])din[j+c]=din[j]+1,his[j+c]=j;
}
din[c]=1;his[c]=0;
}
for(int i=g;i>=0;i--)if(din[i]){gmax=i;break;}; nmin=din[gmax];
int co=gmax, ram=nmin;
while(ram){
if(din[his[co]]==ram-1){
viz[kviz++]=co-his[co];
co=his[co];ram--;
}else{
dfunc(his[co],ram-1);
}
}
outputFunc();
return 0;
}