frp

E

frp
May 16th, 2011
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. typedef unsigned char uchar;
  5. typedef unsigned uint;
  6. int a[30000];
  7. int mlc1[25001];
  8. int mlc2[25001];
  9. int* mlc;
  10. int* mlo;
  11. uchar mbits[30000][3200];
  12. void setbit(int i,int j)
  13. {
  14.    mbits[i][j>>3]|=1<<(j&7);
  15. }
  16. bool getbit(int i,int j)
  17. {
  18.    return mbits[i][j>>3]&(1<<(j&7));
  19. }
  20. ///
  21. bool res[30000];
  22. ///
  23. int main()
  24. {
  25.    uint n;scanf("%u",&n);
  26.    uint sum=0;
  27.    for(int i=0;i<n;i++)
  28.    {
  29.        scanf("%u",&a[i]);
  30.        sum+=a[i];
  31.    }
  32.    uint osum=sum;
  33.    sum>>=1;mlc=mlc1;mlo=mlc2;
  34.    for(int i=0;i<=sum;i++)
  35.    {
  36.        if(i<a[0])mlc[i]=0;
  37.        else
  38.        {
  39.            mlc[i]=a[0];
  40.            setbit(0,i);
  41.        }
  42.    }
  43.    uint currsum=a[0];
  44.    for(int i=1;i<n;i++)
  45.    {
  46.        swap(mlc,mlo);
  47.        bool bf=false;
  48.        currsum=min(currsum+a[i],sum);
  49. //        for(int j=0;j<=currsum;j++)mlo[j]=mlc[j];
  50.        for(int j=0;j<=currsum;j++)
  51.        {
  52.            if(j<a[i])mlc[j]=mlo[j];
  53.            else if(mlo[j]>mlo[j-a[i]]+a[i])mlc[j]=mlo[j];
  54.            else
  55.            {
  56.                mlc[j]=mlo[j-a[i]]+a[i];
  57.                setbit(i,j);
  58.            }
  59.            if(mlc[j]==sum)bf=true;
  60.        }
  61.        if(bf)break;
  62.    }
  63.    printf("%u %u\n",mlc[sum],osum-mlc[sum]);
  64.    int js=sum;
  65.    for(int i=n-1;i>=0;i--)
  66.    {
  67.        if(!getbit(i,js))res[i]=false;
  68.        else
  69.        {
  70.            res[i]=true;
  71.            js-=a[i];
  72.        }
  73.    }
  74.    bool fst=true;
  75.    for(int i=0;i<n;i++)
  76.        if(res[i])
  77.        {
  78.            if(fst)fst=false;
  79.            else printf(" ");
  80.            printf("%d",i+1);
  81.        }
  82.    printf("\n");
  83.    fst=true;
  84.    for(int i=0;i<n;i++)
  85.        if(!res[i])
  86.        {
  87.            if(fst)fst=false;
  88.            else printf(" ");
  89.            printf("%d",i+1);
  90.        }
  91.    printf("\n");
  92.    return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment