BZOJ_1334_[Baltic2008]Elect_DP+语文题

Posted fcwww

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}

 

以上是关于BZOJ_1334_[Baltic2008]Elect_DP+语文题的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ_1342_[Baltic2007]Sound静音问题_单调队列

BZOJ_5180_[Baltic2016]Cities_ 斯坦纳树

[bzoj1369][Baltic2003]Gem_树形dp_结论题

[bzoj1342][Baltic2007]Sound静音问题_单调队列

bzoj1339/1163:[Baltic2008]Mafia

BZOJ1166 : [Baltic2008]Magical Stones