frp

E

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