Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- typedef unsigned char uchar;
- typedef unsigned uint;
- int a[30000];
- int mlc[25001];
- int mlo[25001];
- uchar mbits[30000][3200];
- void setbit(int i,int j)
- {
- mbits[i][j>>3]|=1<<(j&7);
- }
- bool getbit(int i,int j)
- {
- return mbits[i][j>>3]&(1<<(j&7));
- }
- ///
- bool res[30000];
- ///
- int main()
- {
- uint n;scanf("%u",&n);
- uint sum=0;
- for(int i=0;i<n;i++)
- {
- scanf("%u",&a[i]);
- sum+=a[i];
- }
- uint osum=sum;
- sum>>=1;
- for(int i=0;i<=sum;i++)
- {
- if(i<a[0])mlc[i]=0;
- else
- {
- mlc[i]=a[0];
- setbit(0,i);
- }
- }
- uint currsum=a[0];
- for(int i=1;i<n;i++)
- {
- currsum=min(currsum+a[i],sum);
- for(int j=0;j<=currsum;j++)mlo[j]=mlc[j];
- for(int j=0;j<=currsum;j++)
- {
- if(j<a[i])mlc[j]=mlo[j];
- else if(mlo[j]>mlo[j-a[i]]+a[i])mlc[j]=mlo[j];
- else
- {
- mlc[j]=mlo[j-a[i]]+a[i];
- setbit(i,j);
- }
- }
- }
- printf("%u %u\n",mlc[sum],osum-mlc[sum]);
- int js=sum;
- for(int i=n-1;i>=0;i--)
- {
- if(!getbit(i,js))res[i]=false;
- else
- {
- res[i]=true;
- js-=a[i];
- }
- }
- bool fst=true;
- for(int i=0;i<n;i++)
- if(res[i])
- {
- if(fst)fst=false;
- else printf(" ");
- printf("%d",i+1);
- }
- printf("\n");
- fst=true;
- for(int i=0;i<n;i++)
- if(!res[i])
- {
- if(fst)fst=false;
- else printf(" ");
- printf("%d",i+1);
- }
- printf("\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment