Cod sursa(job #2070089)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 19 noiembrie 2017 11:14:37
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct m{
    long long val;
    int quantity;
    int ord;
}monede[31];
int v[31],bun[31];
bool cmp(m a, m b){
    if(a.val<b.val)
        return 0;
    return 1;
}
long long pow(int a, int b){
    long long c=1;
    while(b>0){
        c*=a;
        b--;
    }
    return c;
}
int n, flag;
void pay(long long s, int used){
    if(flag==0){ /// nu am gasit inca nicio solutie
        if(s==0){
            flag=used;
            for(int i=1;i<=n;i++)
                bun[i]=v[i];
        }
        else
            for(int i=1;i<=n && flag==0;i++)
                if(monede[i].val<=s && monede[i].quantity>0){
                    monede[i].quantity--;
                    v[monede[i].ord]++;
                    pay(s-monede[i].val,used+1);
                    monede[i].quantity++;
                    v[monede[i].ord]--;
                }
    }
}
int main()
{
    FILE *fin, *fout;
    int c,i;
    long long l,x;
    fin=fopen("shop.in","r");
    fout=fopen("shop.out","w");
    fscanf(fin,"%d %d %lld\n",&n,&c,&l);
    for(i=1;i<=n;i++){
        fscanf(fin,"%lld %d\n",&x,&monede[i].quantity);
        x=pow(c,x);
        monede[i].val=x;
        monede[i].ord=i;
    }
    sort(monede+1,monede+n+1,cmp);
    pay(l,0);
    fprintf(fout,"%d\n",flag);
    for(i=1;i<=n;i++)
        fprintf(fout,"%d ",bun[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}