BZOJ1334:[Baltic2008]Elect(背包DP)
Description
N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党的席位仍大于总数的一半,则这个政党被称为是多余的,这是不允许的.
Input
第一行给出有多少个政党.其值小于等于300
下面给出每个政党的席位数.总席位数小于等于 100000
Output
你的组阁方案中最多能占多少个席位.
Sample Input
4
1 3 2 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 }