Pagini recente » Cod sursa (job #1530688) | Cod sursa (job #1910621) | Cod sursa (job #1050572) | Cod sursa (job #2055149) | Cod sursa (job #787258)
Cod sursa(job #787258)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("zebughil.in");
ofstream g("zebughil.out");
#define nmax 18
#define Exp ((1<<17)+1)
#define inf (1<<29)
int n, G, a[nmax], dp[Exp][nmax];
void citeste(){
f >> n >> G;//numarul de greutati si Greutatea maxima ce poate sa o transporte un camion
for(int i=1; i<=n; ++i) f >> a[i];
}
void reset(){
for(int conf=0; conf<(1<<n); ++conf){
for(int i=1; i<=n; ++i) dp[conf][i] = inf;
}
}
void rezolva(){
//trebuie sa aflu numarul minim de camioane a. i. sa transport toate greutatile
//dp[conf][j] = X = cantitea pusa in ultmul camion folosind greutatile corespunzatoare bitilor de 1 din conf si avand j camioane
int T = 3;
for(; T; --T){
citeste();
reset();
//initialiez dinamica
for(int i=0; i<n; ++i) dp[(1<<i)][1] = a[i+1];//cantitaea din ultimul camion folosind greautatea i(initial am doar un camion; trebuie sa incep de la ceva)
for(int conf=0; conf<(1<<n); ++conf){
for(int j=1; j<=n; ++j){//am j camioane
if (dp[conf][j] == inf) continue;//daca nu am reusit sa ajung in starea asta
for(int i=0; i<n; ++i){//pentru fiecare bit de 0 il fac 1
if ( (conf & (1<<i) ) == 0 ){
int new_conf = conf | (1<<i);
//intr-o stare (conf,j) vreau sa am acea greutate cat mai mica pentru a permite cat mai multe greutati
//=> cand ma duc intr-o noua stare sa iau minimnul
if (dp[conf][j] + a[i+1] > G){//daca noua greutate nu o pot duce cu al j-lea camioan atunci mai bag inca unul
dp[new_conf][j+1] = a[i+1];//aici nu are rost pentru ca inseama ca iau a i+1-a greautate singura si greutatea minima posibila e chiar ea(a[i+1])
}else {
dp[new_conf][j] = min(dp[new_conf][j], dp[conf][j] + a[i+1]);
}
}
}
}
}
for(int j=1; j<=n; ++j){
if (dp[(1<<n)-1][j] != inf){
g << j << "\n";
break;
}
}
}
}
int main(){
rezolva();
f.close();
g.close();
return 0;
}