# include <cstdio>
# include <algorithm>
# define OVER (10000*10000+3)
using namespace std;
bool poss[1<<24][2];
int val[1<<24];
int przedmioty[24];
int plecaki[100];
int n, m;
void pass(int to, int x, int mask, int mask2)//add to all mask2|(subset of mask)
{
if (mask==0)
{
if (poss[mask2][1-to])
poss[mask2|x][to]=true;
return;
}
int bit=mask&-mask;
pass(to, x, mask&~bit, mask2);
pass(to, x, mask&~bit, mask2|bit);
}
int main()
{
scanf("%d%d", &n, &m);
for (int i=0; i<n; ++i)
scanf("%d", przedmioty+i);
for (int mask=0; mask<(1<<n); ++mask)
{
for (int i=0; i<n; ++i)
if (mask&(1<<i))
{
val[mask]+=przedmioty[i];
if (val[mask]>OVER)
val[mask]=OVER;
}
}
for (int i=0; i<m; ++i)
{
scanf("%d", plecaki+i);
plecaki[i]*=-1;
}
sort(plecaki, plecaki+m);
poss[0][1]=true;
for (int i=0; i<n && i<m; ++i)
{
for (int j=0; j<(1<<n); ++j)
poss[j][i%2]=false;
for (int j=0; j<(1<<n); ++j)
if (val[j]<=-plecaki[i])
{
pass(i%2, j, ((1<<n)-1)&~j, 0);
}
if (poss[(1<<n)-1][i%2])
{
printf("%d\n", i+1);
return 0;
}
}
printf("NIE\n");
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | # include <cstdio> # include <algorithm> # define OVER (10000*10000+3) using namespace std; bool poss[1<<24][2]; int val[1<<24]; int przedmioty[24]; int plecaki[100]; int n, m; void pass(int to, int x, int mask, int mask2)//add to all mask2|(subset of mask) { if (mask==0) { if (poss[mask2][1-to]) poss[mask2|x][to]=true; return; } int bit=mask&-mask; pass(to, x, mask&~bit, mask2); pass(to, x, mask&~bit, mask2|bit); } int main() { scanf("%d%d", &n, &m); for (int i=0; i<n; ++i) scanf("%d", przedmioty+i); for (int mask=0; mask<(1<<n); ++mask) { for (int i=0; i<n; ++i) if (mask&(1<<i)) { val[mask]+=przedmioty[i]; if (val[mask]>OVER) val[mask]=OVER; } } for (int i=0; i<m; ++i) { scanf("%d", plecaki+i); plecaki[i]*=-1; } sort(plecaki, plecaki+m); poss[0][1]=true; for (int i=0; i<n && i<m; ++i) { for (int j=0; j<(1<<n); ++j) poss[j][i%2]=false; for (int j=0; j<(1<<n); ++j) if (val[j]<=-plecaki[i]) { pass(i%2, j, ((1<<n)-1)&~j, 0); } if (poss[(1<<n)-1][i%2]) { printf("%d\n", i+1); return 0; } } printf("NIE\n"); } |
English