Pagini recente » Cod sursa (job #413955) | Cod sursa (job #274834) | Cod sursa (job #2784613) | Cod sursa (job #471207) | Cod sursa (job #2121571)
#include <fstream>
using namespace std;
ifstream cin ("zebughil.in");
ofstream cout ("zebughil.out");
const int inf = 1e9;
long long val[20];
int dp[1 << 17];
int BIT[20];
int MASK , CONT;
void backt(int bit , int val){
if (val > MASK){
return;
}
if (bit == CONT){
dp[MASK ^ val] = min (dp[MASK ^ val] , dp[MASK] + dp[val]);
return;
}
backt(bit + 1 , val);
backt(bit + 1 , val + (1 << BIT[bit]));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int test = 3;
while (test--){
int n;
long long g;
cin>>n>>g;
for (int i=1; i<=n; i++){
cin>>val[i];
}
for (int mask = 0; mask < (1 << n); mask++){
dp[mask] = inf;
long long sum = 0;
for (int bit = 0; bit < n; bit++){
if ((1 << bit) & mask){
sum += val[bit + 1];
}
}
if (sum <= g){
dp[mask] = 1;
}
}
for (int mask = 0; mask < (1 << n); mask++){
if (mask == inf){
continue;
}
int cont = 0;
int now = (1 << n) - 1;
now ^= mask;
for (int bit = n - 1; bit >= 0; bit--){
if ((1 << bit) & now && (1 << bit) <= mask){
BIT[cont] = bit;
cont++;
}
}
MASK = mask;
CONT = cont;
backt(0 , 0);
}
cout<<dp[(1 << n) - 1]<<'\n';
}
return 0;
}