很有趣的一道 01 背包
- 首先,每个科目单独进行考虑
- 对于每个科目,理想情况应该是左右脑的时间尽可能相等
- 相等时为
sum/2
,看作 01 背包问题,背包的容量是sum
,物品是该科目内的题目,放置题目使得背包尽可能装满 sum
减去背包的最大装载即为该科目需要花费的时间
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 25
#define MAXM 5000
using namespace std;
int t[5],a[MAXN],res,f[MAXM];
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
for(int i=0;i<4;i++)scanf("%d",&t[i]);
for(int i=0;i<4;i++){
int sum=0;
for(int j=1;j<=t[i];j++){
scanf("%d",&a[j]);
sum+=a[j];
}
for(int j=1;j<=t[i];j++)
for(int k=sum/2;k>=a[j];k--)
f[k]=max(f[k],f[k-a[j]]+a[j]);
res+=sum-f[sum/2];
memset(f,0,sizeof(f));
}
printf("%d",res);
return 0;
}