用01背包的思路写的,但是测试点1,2,6,9,10 TLE,剩下五个wa
#include<bits/stdc++.h>
using namespace std;
int subject[5]; //每个科目有多少道题
int value[25]; //每道题目花费的时间(01背包中的价值)
int t = 0; //最后花费的总时间
int main()
{
for (int i = 1; i <= 4; i++) {
scanf("%d", &subject[i]);
}
for (int i = 1; i <= 4; i++) {
int sum = 0; //每科的总时间
int res = 0; //背包能放下的最大价值(不超过sum/2的前提下,能做的题目时间的总和)
int dp[21][61]; //背包
memset(dp, 0, sizeof(dp)); //每次都需要清空背包
for (int j = 1; j <= subject[i]; j++) {
scanf("%d", &value[j]); //读入每道题的时间
sum += value[j]; //计算该科总时间
}
for (int n = 1; n <= subject[i]; n++) { //遍历这个科目的题目
for (int size = 1; size <= sum / 2; size++) { //背包大小最大为sum/2,从1开始遍历
if (size >= value[n]) { //如果大小为size的背包能放下当前的题目,则需要和之前的情况比较
// 价值即做题时间
// 当前最大价值 = max( 不放这题的最大价值 , 放这题的最大价值(这题的价值 + 剩余空间的最大价值))
dp[n][size] = max(dp[n - 1][size], value[n] + dp[n - 1][size - value[a]]);
res = max(res, dp[n][size]); //记录最大价值
}
}
}
t += (sum - res); //科目总时间 - res = 做完该科目题目的最短时间
}
printf("%d", t);
return 0;
}