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;
}