题解:本题主要考查贪心+背包。
简要题意: 给出几个党的席位数,选中的党的席位数要大于总数的一半,并且席位数越多越好,但是去掉最小的选中的党,剩下的席位要小于等于总数的一半。
1.01背包:本题的难点是怎么理解“如果某个政党退出后,其它党的席位仍大于总数的一半,则这个政党被称为是多余的,这是不允许的”这句话。理解了其实就是一个01背包变形。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int a[999],f[121212];
int n,sum,ans;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+n+1,cmp);
int mid=sum>>1;
for(int i=1;i<=n;i++)
for(int j=sum;j>=a[i];j--)
{
f[j]=max(f[j],f[j-a[i]]+a[i]);
if(f[j]>mid&&f[j]-a[i]<=mid)
ans=max(ans,f[j]);
}
cout<<ans<<endl;
cin>>n;
return 0;
}