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[N];
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;
}