Cod sursa(job #3245508)

Utilizator horatiu.avramAvram Popa Cristian Horatiu horatiu.avram Data 29 septembrie 2024 11:17:49
Problema Ghiozdan Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXG 75000
#define MAXGR 200
int frecv[MAXGR+1];
int dp[MAXG+1],sol[MAXG+1];
FILE *fin,*fout;
int maxs,n,g,maxim,x;
void openFiles() {
    fin=fopen("ghiozdan.in","r");
    fout=fopen("ghiozdan.out","w");
}
void closeFiles() {
    fclose(fin);
    fclose(fout);
}
int max(int a,int b) {
    return a>b?a:b;
}
void readInput() {
    maxim=0;
    fscanf(fin,"%d%d",&n,&g);
    for(int i=0; i<n; i++) {
        fscanf(fin,"%d",&x);
        frecv[x]++;
        maxim=max(maxim,x);
    }
}
void printSol() {
    for(int i=maxs; i>0; i-=sol[i]) {
        fprintf(fout,"%d\n",sol[i]);
    }
}
void findSol() {
    dp[0]=1;
    for(int i=maxim; i>0; i--) {
        if(frecv[i]>0) {
            for(int j=g-i; j>=0; j--) {
                int k=1;
                if(dp[j]>0) {
                    while(k<=frecv[i]&&j+k*i<=g&&dp[j+k*i]==0) {
                        dp[j+k*i]=dp[j+(k-1)*i]+1;
                        sol[j+k*i]=i;
                        if(j+k*i>maxs) {
                            maxs=j+k*i;
                        }
                        k++;
                    }
                }
            }
        }
    }
    fprintf(fout,"%d %d\n",maxs,dp[maxs]-1);
    printSol();
}
int main() {
    openFiles();
    readInput();
    findSol();
    closeFiles();
    return 0;
}