Cod sursa(job #2952228)

Utilizator handicapatucavasi eduard handicapatu Data 8 decembrie 2022 20:01:33
Problema Ghiozdan Scor 16
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define INF 2000000000

using namespace std;

ifstream f("ghiozdan.in");
ofstream g("ghiozdan.out");

int n , G , gmax , nmin = INF;
int v[20001];
int dp[20001][20001];
vector < int > ans;
///dp[i][j] - numarul minim de obiecte din primele i cu care se pot umple j grame din ghiozdan

void init(){
    for(int i = 0 ; i <= n ; ++i)
        for(int j = 1 ; j <= G ; ++j)
            dp[i][j] = INF;
}

int main()
{
    f >> n >> G;
    for(int i = 1 ; i <= n ; ++i)
        f >> v[i];
    init();
    for(int i = 1 ; i <= n ; ++i)
        for(int j = 0 ; j <= G ; ++j){
            dp[i][j] = dp[i - 1][j];
            if(j >= v[i] && dp[i][j] > dp[i - 1][j - v[i]] + 1)
                dp[i][j] = dp[i - 1][j - v[i]] + 1;
            if(dp[i][j] != 0 && dp[i][j] != INF && j > gmax)
                gmax = j , nmin = INF;
            if(dp[i][j] != 0 && dp[i][j] != INF && j == gmax && nmin > dp[i][j])
                nmin = dp[i][j];
        }
    g << gmax << " " << nmin << "\n";
    while(nmin > 0){
        for(int i = 1 ; i <= n ; ++i){
            if(gmax - v[i] >= 0 && dp[n][gmax - v[i]] == nmin - 1){
                gmax -= v[i];
                --nmin;
                ans.push_back(v[i]);
                break;
            }
        }
    }
    sort(ans.begin() , ans.end());
    for(auto it : ans)
        g << it << "\n";
    return 0;
}