思路:分成的 两组数每一组的数最后取到的只有两种情况是正确的
1.两组数的和相等 即sum/2 2.两组数无法取到sum/2 最终可得到一组略小于sum/2 另一组略大于sum/2
即转换为0 1背包 问题Sum/2即背包容量
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include <string>
#include <queue>
#include <cstring>
#include <vector>
#include <set>
const int maxn=100010;
using namespace std;
char str[maxn];
int arr[maxn];
int dp[maxn];
int n;
void DP(int sum,int n)
{
for(int i=1;i<=n;i++)
{
for(int j=sum/2;j>=arr[i];j--)
{
dp[j]=max(dp[j],dp[j-arr[i]]+arr[i]);
}
}
int M=max(dp[sum/2],sum-dp[sum/2]),m=min(dp[sum/2],sum-dp[sum/2]);
printf("%d %d\n",M,m);
}
int main()
{
while(gets(str))
{
n=1;
int num=0;
int flag=1;
int sum=0;
for(int i=0;i<strlen(str);i++)
{
if(str[i]>='0'&&str[i]<='9'||str[i]==' ')
{
if(str[i]==' ')
{
sum+=num;
arr[n++]=num;
num=0;
}else
{
num=num*10+str[i]-'0';
}
}else
{
flag=0;
break;
}
}
if(num>0) arr[n]=num;
sum+=num;
if(flag)
{
memset(dp,0,sizeof(dp));
DP(sum,n+1);
}else
{
printf("ERROR\n");
}
}
return 0;
}