Pagini recente » Cod sursa (job #159198) | Cod sursa (job #9269) | Cod sursa (job #2914473) | Cod sursa (job #3242726) | Cod sursa (job #3143644)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("zebughil.in");
ofstream fout("zebughil.out");
const int DIM = 17;
const int INF = 2e9 + 5;
int n, g;
int v[DIM + 5];
int dp[(1LL << (DIM + 1)) + 5][DIM + 2];
//dp[i][j] = cate produse pot transporta cu i camioane;
static inline void Solve() {
fin >> n >> g;
for(int i = 0; i < n; i++)
fin >> v[i];
for(int j = 0; j <= (1LL << n); j++)
for(int i = 1; i <= n; i++)
dp[j][i] = INF;
for(int i = 0; i < n; i++) //initial fiecare camion transporta cate un produs;
dp[(1 << i)][1] = v[i];
for(int j = 1; j < (1LL << n); j++) //pot folosi maxim n camioane;
for(int i = 1; i <= n; i++) {
if(dp[j][i] == INF)
continue;
for(int k = 0; k < n; k++) {
int mask = (1LL << k);
if((mask & j) == 0) { //nu am transportat produsul k in camionul i;
if(dp[j][i] + v[k] <= g)
dp[j | mask][i] = min(dp[j | mask][i], v[k] + dp[j][i]);
else dp[j | mask][i + 1] = min(v[k], dp[j | mask][i + 1]);
}
}
}
for(int i = 1; i <= n; i++)
if(dp[(1LL << n) - 1][i] != INF) {
fout << i;
break;
}
fout << '\n';
}
int main() {
for(int i = 1; i <= 3; i++)
Solve();
return 0;
}