首先
s
u
m
sum
sum如果为奇数输出
0
0
0,否则再判断能不能凑出
s
u
m
/
2
sum/2
sum/2。
如果能,很关键的一点是,如果序列中存在一个奇数,那么删除这个奇数,剩下的
s
u
m
sum
sum为奇数,凑不出2个子序列,如果不存在奇数,那么让每个数除2,因为都是等比例缩小,不会影响。
一直重复,直到找到一个奇数为止
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=110,M=N*2000;
int t,n,m,k,a[N],sum;
bool f[M];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum+=a[i];
if(sum&1)
{
puts("0");
return 0;
}
sum>>=1;
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=sum;j>=a[i];j--)
if(f[j-a[i]])f[j]=1;
if(!f[sum])
{
puts("0");
return 0;
}
puts("1");
while(1)
{
for(int i=1;i<=n;i++)
{
if(a[i]&1)
{
cout<<i<<endl;
return 0;
}
else a[i]>>=1;
}
}
return 0;
}