Pagini recente » Cod sursa (job #1296759) | Cod sursa (job #1341244) | Cod sursa (job #1223071) | Cod sursa (job #2018139) | Cod sursa (job #1308636)
#include <cstdio>
#define NMAX 17
using namespace std;
int n, G;
int a[NMAX];
int Dp[(1 << NMAX)], Sum[(1 << NMAX)], Viz[(1 << NMAX)];
int main(){
freopen("zebughil.in", "r", stdin);
freopen("zebughil.out", "w", stdout);
int T = 3;
while(T){
--T;
scanf("%d %d", &n, &G);
for(int i = 0; i <= (1 << n); ++i)
Dp[i] = Viz[i] = 0;
for(int i = 1; i <= (1 << n); ++i)
Sum[i] = G;
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
for(int i = 0; i < n; ++i){
Dp[1 << i] = Viz[(1 << i)] = 1;
Sum[1 << i] = G - a[i];
}
for(int Mask = 1; Mask < (1 << n); ++Mask)
for(int i = 0; i < n; ++i)
if(Mask & (1 << i) > 0){
int NewMask = Mask | (1 << i);
if(Sum[Mask] >= a[i]){
if(!Viz[NewMask] || Dp[NewMask] > Dp[Mask] || (Dp[NewMask] == Dp[Mask] && Sum[Mask] - a[i] > Sum[NewMask])){
Dp[NewMask] = Dp[Mask];
Sum[NewMask] = Sum[Mask] - a[i];
Viz[NewMask] = 1;
}
}
else
if(!Viz[NewMask] || Dp[NewMask] > Dp[Mask] + 1 || (Dp[NewMask] == Dp[Mask] + 1 && G - a[i] > Sum[NewMask])){
Dp[NewMask] = Dp[Mask] + 1;
Sum[NewMask] = G - a[i];
Viz[NewMask] = 1;
}
}
printf("%d\n", Dp[(1 << n) - 1]);
}
}