BZOJ_1334_[Baltic2008]Elect_DP+语文题

BZOJ_1334_[Baltic2008]Elect_DP

Description

N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于
总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党的席位仍大于总
数的一半,则这个政党被称为是多余的,这是不允许的.

Input

第一行给出有多少个政党.其值小于等于300 
下面给出每个政党的席位数.总席位数小于等于 100000

Output

你的组阁方案中最多能占多少个席位.

Sample Input

4
1 3 2 4

Sample Output

7
//选择第二个政党和第四个
 

分析:
从大到小排序,01背包,状态从[1,sum/2]中转移。保证当去掉当前政党后剩下的都不会超过总数的一半。
 
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
int a[350],f[N],n,sum,ans;
bool cmp(int x,int y){return x>y; }
int main() {
	scanf("%d",&n);
	int i,j;
	for(i=1;i<=n;++i) scanf("%d",&a[i]),sum+=a[i];
	sort(a+1,a+n+1,cmp);
	f[0]=1;
	for(i=1;i<=n;i++) {
		for(j=sum/2+a[i];j>=a[i];j--) {
			if(f[j-a[i]]) {
				f[j]=1;
				ans=max(ans,j);
			}
		}
	}
	printf("%d",ans);
}

 

posted @ 2018-03-30 19:49  fcwww  阅读(131)  评论(0编辑  收藏  举报