题目描述
N个政党要组成一个联合内阁,每个党都有自己的席位数.
现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好.
对于一个联合内阁,如果某个政党退出后,其它党的席位仍大于总数的一半,则这个政党被称为是多余的,这是不允许的.
输入格式
第一行给出有多少个政党.其值小于等于300
下面给出每个政党的席位数.总席位数小于等于 100000
输出格式
你的组阁方案中最多能占多少个席位.
输入输出样例
输入 #1复制
4 1 3 2 4
输出 #1复制
7
说明/提示
提示 选择第二个政党和第四个
一道非常脑残的01背包。。。第一眼我还没看出来(证明gyf_Bird太弱了)
- 选好的内阁要踢的肯定是在内阁中站位最小的进行判断
- 从大到小排序,保证最后每个状态加入的政党席位最小。
- 01背包,再同时判断当前内阁席位数是否大于一半,记录答案。
- 好好看题,有点绕
Code:
#include<bits/stdc++.h> using namespace std; const int maxn = 1000011; int a[maxn],dp[maxn],n,sum,ans; int main(){ cin>>n; for(int i = 1;i<=n;++i)cin>>a[i],sum += a[i]; int mid = sum>>1; sort(a+1,a+n+1); for(int i = n;i>=1;--i){ for(int j = sum;j>=0;--j){ if(j>=a[i])dp[j] = max(dp[j],dp[j-a[i]]+a[i]); if(dp[j] > mid && dp[j]-a[i] <= mid) ans = max(ans,dp[j]); } } cout<<ans<<endl; }