Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- #define MAXN 100000
- #define MAXS 50000
- #define MAXV 5000
- int v[MAXN], fr[MAXV + 1];
- int frr[MAXV + 1];
- int d[MAXS + 1], nr[MAXS + 1];
- int s;
- inline char bun(int k)
- {
- memset(d, -1, sizeof d);
- d[0] = 0;
- int i, j;
- for(i = 1; i <= MAXV; i++)
- {
- if((i | k) == k && fr[i])
- {
- for(j = 0; j < i; j++)
- if(d[j] != -1)
- nr[j] = fr[i];
- for(j = i; j <= s; j++)
- {
- if(d[j] == -1 && nr[j - i] > 0)
- {
- d[j] = i;
- nr[j] = nr[j - i] - 1;
- }
- else if(d[j] != -1)
- nr[j] = fr[i];
- else
- nr[j] = 0;
- }
- }
- }
- return d[s] != -1;
- }
- int main()
- {
- freopen("sormin.in", "r", stdin);
- freopen("sormin.out", "w", stdout);;
- int n, i, r = 0;
- scanf("%d%d", &n, &s);
- for(i = 0; i < n; i++)
- {
- scanf("%d", &v[i]);
- fr[v[i]]++;
- }
- i = 0;
- while((1 << i) <= s)
- {
- r += (1 << i);
- i++;
- }
- i--;
- while(i >= 0){
- if(bun(r - (1 << i)))
- r -= (1 << i);
- i--;
- }
- bun(r);
- int x, nrr = 0;
- x = s;
- while(x > 0)
- {
- frr[d[x]]++;
- x -= d[x];
- nrr++;
- }
- printf("%d %d\n", r, nrr);
- for(i = 0; i < n; i++)
- {
- if(frr[v[i]]){
- printf("%d ", v[i]);
- frr[v[i]]--;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement