问题链接
1.dfs解法
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
const int MAXN=1005;
string str;
int num[MAXN];
int sum;
int minn=sum;
int maxnn;
int sizee;
int ok=1;
void dfs(int now,int ss)
{
if(ok)
return;
if(ss>sum/2)
return;
if(ss==sum/2)
{
ok=1;
maxnn=sum/2;
return ;
}
if(sum/2-ss<minn)
{
minn=sum/2-ss;
maxnn=ss;
}
if(now>=sizee)
return;
dfs(now+1,ss+num[now]); //选下标now的值
dfs(now+1,ss); //不选
}
int main()
{
while(getline(cin,str))
{
str+=' ';
ok=0;
sizee=0;
sum=0;
maxnn=0;
int error=0;
int xx=0;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')
{
num[sizee++]=xx;
sum+=xx;
xx=0;
continue;
}
if(str[i]>='0' && str[i]<='9')
{
xx*=10;
xx+=str[i]-'0';
}else {
error=1;
break;
}
}
minn=sum;
if(error)
{
printf("ERROR\n");
continue;
}
dfs(0,0); //从下标0开始做决定
int a=sum-maxnn;
int b=maxnn;
printf("%d %d\n",a,b);
}
return 0;
}
2.dp解法 0/1背包问题
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int MAXN=111005;
string str;
int num[MAXN];
int sum;
int minn=sum;
int maxnn;
int sizee;
int ok=1;
int dp[MAXN];
int dpp()
{
for(int i=1;i<=sizee;i++)
{
for(int j=sum/2;j>=num[i];j--)
{
dp[j]=max(dp[j],dp[j-num[i]]+num[i]);
}
}
return dp[sum/2];
}
int main()
{
while(getline(cin,str))
{
memset(dp,0,sizeof(dp));
str+=' ';
ok=0;
sizee=0;
sum=0;
maxnn=0;
int error=0;
int xx=0;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')
{
num[++sizee]=xx;
sum+=xx;
xx=0;
continue;
}
if(str[i]>='0' && str[i]<='9')
{
xx*=10;
xx+=(str[i]-'0');
}else {
error=1;
break;
}
}
minn=sum;
if(error)
{
printf("ERROR\n");
continue;
}
maxnn=dpp();
int a=sum-maxnn;
int b=maxnn;
printf("%d %d\n",a,b);
}
return 0;
}