Cod sursa(job #2340582)

Utilizator bogdi1bogdan bancuta bogdi1 Data 10 februarie 2019 18:09:05
Problema Zebughil Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
const int doila17 = 1<<17;
struct Dinamica
{
    int ans,luat;
} dp[doila17+5];
int cost[20];
map<int,int> mp;
int main()
{   freopen("zebughil.in", "r",stdin);
    freopen("zebughil.out", "w",stdout);
    int n,g,i,put2,k,doilan,ii,nr,nrr;
    put2=1;
    for(i=0; i<=17; i++){
        mp[put2]=i;
        put2*=2;
    }
    for(k=1; k<=3; k++){
        memset(dp, 20, sizeof(dp));
        dp[0].ans=0;
        scanf("%d%d", &n, &g);
        dp[0].luat=g;
        for(i=0; i<n; i++)
            scanf("%d", &cost[i]);
        doilan=1<<n;
        for(i=1; i<doilan; i++){
            ii=i;
            while(ii){
                nr=ii&(ii-1);
                nr=ii-nr;
                nrr=mp[nr];
                if((long long)cost[nrr]+dp[i-nr].luat<=g){
                    if(dp[i].ans>dp[i-nr].ans){
                        dp[i].ans=dp[i-nr].ans;
                        dp[i].luat=cost[nrr]+dp[i-nr].luat;
                    }
                }
                else{
                    if(dp[i].ans>dp[i-nr].ans+1){
                        dp[i].ans=dp[i-nr].ans+1;
                        dp[i].luat=cost[nrr];
                    }
                }
                ii&=(ii-1);
            }
        }
        printf("%d\n", dp[doilan-1].ans);
    }
    return 0;
}