很难想象这个题竟然是01背包,看来还得多多学习。
首先将所有的数据划分为俩组,如果俩组的时间都有越接近于sum/2,那么就代表耗费时间越少。
于是乎对其中一组进行处理,使其尽量接近于sum/2
对于看到第 i 个题目,耗费时间 j 所能达到的最大价值(时间)
01背包大概就是 求 dp[sum/2]
这就使得已经让一组数据最接近sum/2
time=max(dp[sum/2],sum-dp[sum]/2)
#include <bits/stdc++.h>
using namespace std;
int s[5];
int a[2001];
int dp[20001];
int ans;
int main() {
cin >> s[1] >> s[2] >> s[3] >> s[4];
int k;
for (k = 1; k <= 4; k++) {
int sum = 0;
memset(a, 0, sizeof(a));
for (int j = 1; j <= s[k]; j++) {
cin >> a[j];
sum += a[j];
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= s[k]; i++)
for (int j = sum / 2 ; j >= a[i]; j--) {
dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
//printf("dp[%d]=%d ", j, dp[j]);
}
int time ;
time = max(dp[sum/2],sum - dp[sum / 2]);
ans += time;
}
cout << ans;
}