P2392 题解

136 阅读1分钟

题目链接

思路

单独考虑一个学科,左右脑可以同时工作,那就尽量让他俩工作时间相近。设该学科所有题目之和为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;
}