frp

E

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