frp

E

frp
May 16th, 2011
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.06 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.  
  9. bool res[30000];
  10. int main()
  11. {
  12.     uint n;scanf("%u",&n);
  13.     uint sum=0;
  14.     for(int i=0;i<n;i++)
  15.     {
  16.         scanf("%u",&a[i]);
  17.         sum+=a[i];
  18.     }
  19.     uint osum=sum;
  20.     sum>>=1;
  21.     for(int i=0;i<=sum;i++)
  22.     {
  23.         if(i!=a[0])mlc[i]=-1;
  24.         else
  25.         {
  26.             mlc[i]=0;
  27.         }
  28.     }
  29.     uint currsum=a[0];
  30.     for(int i=1;i<n;i++)
  31.     {
  32.         currsum=min(currsum+a[i],sum);
  33.         for(int j=currsum;j>=0;j--)
  34.             if(mlc[j]!=-1 && j+a[i]<=currsum && mlc[j+a[i]]==-1)mlc[j+a[i]]=i;
  35.     }
  36.     int mj=0;
  37.     for(mj=sum;mj>=0;mj--)if(mlc[mj]!=-1)break;
  38.     printf("%u %u\n",mj,osum-mj);
  39.     int p=mj;
  40.     while(p>=0)
  41.     {
  42.         if(mlc[p]==-1)break;
  43.         res[mlc[p]]=true;
  44.         p=p-a[mlc[p]];
  45.     }
  46.     bool fst=true;
  47.     for(int i=0;i<n;i++)
  48.         if(res[i])
  49.         {
  50.             if(fst)fst=false;
  51.             else printf(" ");
  52.             printf("%d",i+1);
  53.         }
  54.     printf("\n");
  55.     fst=true;
  56.     for(int i=0;i<n;i++)
  57.         if(!res[i])
  58.         {
  59.             if(fst)fst=false;
  60.             else printf(" ");
  61.             printf("%d",i+1);
  62.         }
  63.         printf("\n");
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment