BZOJ1334Elect

1334: [Baltic2008]Elect
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 449 Solved: 246
Description
N個政黨要組成一個聯合內閣,每個黨都有自己的席位數. 現在希望你找出一種方案,你選中的黨的席位數要大於總數的一半,並且聯合內閣的席位數越多越好. 對於一個聯合內閣,如果某個政黨退出後,其它黨的席位仍大於總數的一半,則這個政黨被稱爲是多餘的,這是不允許的.
Input
第一行給出有多少個政黨.其值小於等於300 下面給出每個政黨的席位數.總席位數小於等於 100000
Output
你的組閣方案中最多能佔多少個席位.
Sample Input
4
1 3 2 4
Sample Output
7
HINT
選擇第二個政黨和第四個
01揹包。。
倒序排序然後揹包
附上本蒟蒻的代碼:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,f[100001],w[301],v[301],sum=0,ans=0;

int read()
{
    int w=0,c=1; char ch=getchar();
    while (ch<'0' || ch>'9')
      {
        if (ch=='-') c=-1;
        ch=getchar();
      }
    while (ch>='0' && ch<='9')
      w=w*10+ch-'0',ch=getchar();
    return w*c;
}

bool cmp(int x,int y)
{
    return x>y;
}

int main()
{
    int i,j;
    n=read();
    for (i=1;i<=n;i++) v[i]=read(),sum+=v[i];
    sort(v+1,v+n+1,cmp);
    f[0]=1;
    for (i=1;i<=n;i++)
      for (j=sum/2+v[i];j>=v[i];j--)
        if (f[j-v[i]])
          {
            f[j]=1;
            ans=max(j,ans);
          }
    printf("%d",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章