BZOJ1334:[Baltic2008]Elect(背包DP)

Description

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

Input

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

Output

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

Sample Input

4
1 3 2 4

Sample Output

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

Solution 

01背包,第二维转移的时候加一点限制就好了。
多说无益不如看代码

Code

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define N (100009)
 5 using namespace std;
 6 
 7 int n,sum,f[N],a[N];
 8 
 9 int main()
10 {
11     scanf("%d",&n);
12     for (int i=1; i<=n; ++i)
13         scanf("%d",&a[i]),sum+=a[i];
14     sort(a+1,a+n+1);
15     f[0]=1;
16     for (int i=n; i>=1; --i)
17         for (int j=min(sum,sum/2+a[i]); j>=a[i]; --j)
18             f[j]|=f[j-a[i]];
19     for (int i=sum; i>sum/2; --i)
20         if (f[i]) {printf("%d\n",i); return 0;}
21     puts("0");
22 }
posted @ 2018-09-27 20:35  Refun  阅读(188)  评论(0编辑  收藏  举报