wa和tle,球球大佬帮忙看看,思路和注释写得很详细很详细
查看原帖
wa和tle,球球大佬帮忙看看,思路和注释写得很详细很详细
265218
她是光芒楼主2021/8/31 17:07

用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;
}
2021/8/31 17:07
加载中...