思路
单独考虑一个学科,左右脑可以同时工作,那就尽量让他俩工作时间相近。设该学科所有题目之和为sum,那么就转化成让一个的工作时间尽量接近mid=sum/2,进而转化成01背包问题,其中一个脑子是背包,问用mid的时间最多能完整地完成多少工作。
代码
#include <bits/stdc++.h>
#define rep(i,st,ed) for(int i=st;i<=ed;++i)
using namespace std;
const int N=21;
int s1,s2,s3,s4,ans;
int a[N],f[1300];
void solve(int n)
{
int sum=0;
rep(i,1,n)
{
cin>>a[i];
sum+=a[i];
}
int mid=sum>>1;
rep(i,0,mid)
f[i]=0;
rep(i,1,n)
{
for(int j=mid;j>=a[i];--j)
{
f[j]=max(f[j-a[i]]+a[i],f[j]);
}
}
ans+=sum-f[mid];
}
int main()
{
cin>>s1>>s2>>s3>>s4;
solve(s1);
#if 1
solve(s2);
solve(s3);
solve(s4);
#endif
cout<<ans<<endl;
}