您的位置:首页 > 其它

AtCoder Grand Contest 020 C - Median Sum (背包问题+bitset )

2018-01-19 20:05 417 查看
Time limit : 2sec / Memory limit : 512MB

Score : 700 points


Problem Statement

You are given N integers A1, A2,
..., AN.
Consider the sums of all non-empty subsequences of A.
There are 2N−1 such
sums, an odd number.
Let the list of these sums in non-decreasing order be S1, S2,
..., S2N−1.
Find the median of this list, S2N−1.


Constraints

1≤N≤2000
1≤Ai≤2000
All input values are integers.


Input

Input is given from Standard Input in the following format:
N
A1 A2 … AN



Output

Print the median of the sorted list of the sums of all non-empty subsequences of A.


Sample Input 1

Copy
3
1 2 1



Sample Output 1

Copy
2

In this case, S=(1,1,2,2,3,3,4).
Its median is S4=2.


Sample Input 2

Copy
1
58



Sample Output 2

Copy
58

In this case, S=(58).
题意:序列构成的子集加起来然后求出中位数
思路:背包问题+bitset
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <bitset>
const int N = 100005;
using namespace std;
typedef long long ll;
int a
;
int n;
bitset<4000010> f;
int main()
{
int i,j,k=0;
scanf("%d",&n);
f[0]=1;
for(i=1;i<=n;i++)  //得到n个数构成的集合f,有则为1,无则为0
{
scanf("%d",&j);
f=f|(f<<j);
k+=j;
//printf("%d\n",f);
}
/*for(int i=1;i<=k;i++)
{
if(f[i]==0)
printf("0\n");
else
printf("1\n");
}*/
for(i=(k+1)/2;!f[i];i++);//从总值的一半开始找
printf("%d\n",i);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: