Cod sursa(job #2242101)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 17 septembrie 2018 19:46:52
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 17;

int dp[1 << MAXN][MAXN + 1];
int arr[MAXN];

int main() {
    FILE *fi, *fout;
    int i, n, g;
    fi = fopen("zebughil.in" ,"r");
    fout = fopen("zebughil.out" ,"w");
    while(fscanf(fi,"%d %d " ,&n,&g) == 2) {
        for(i = 0; i < n; i++) {
            fscanf(fi,"%d " ,&arr[i]);
        }
        for(i = 1; i <= n; i++) {
            dp[0][i] = g + 1;
        }
        for(int conf = 1; conf < (1 << n); conf++) {
            int cnt = __builtin_popcount(conf);
            for(i = 0; i <= n; i++) {
                dp[conf][i] = g + 1;
            }
            for(i = 0; i < n; i++) {
                if(conf & (1 << i)) {
                    for(int j = 1; j <= cnt; j++) {
                        if(dp[conf ^ (1 << i)][j] + arr[i] <= g) {
                            dp[conf][j] = min(dp[conf][j], dp[conf ^ (1 << i)][j] + arr[i]);
                        }
                        if(dp[conf ^ (1 << i)][j - 1] <= g) {
                            dp[conf][j] = min(dp[conf][j], arr[i]);
                        }
                    }
                }
            }
        }
        i = 1;
        while(dp[(1 << n) - 1][i] > g) {
            i++;
        }
        fprintf(fout,"%d\n" ,i);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}