bool dp,感觉思路有一点点迷糊,hack数据已过,马蜂不是很良好
#include<bits/stdc++.h>
using namespace std;
const int N=205,M=45;
bool dp[N][N*M]={0};
int val[N]={0};
int main()
{
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
sum+=val[i];
}
int mid=sum/2,num=n/2+1;
dp[1][val[1]]=1;
for(int k=2;k<=n;k++)
{
for(int i=num;i;i--)
{
for(int j=mid;j>=val[k];j--)
{
dp[i][j]=(dp[i][j]|dp[i-1][j-val[k]]);
}
}
}
num--;
int ans=0;
for(int i=mid;i;i--)
{
if(dp[num][i])
{
ans=i;
break;
}
}
if(n%2==1)
{
num++;
for(int i=mid;i;i--)
{
if(dp[num][i])
{
ans=max(ans,i);
break;
}
}
}
printf("%d %d",ans,sum-ans);
}