P2392 kkksc03考前临时抱佛脚

题目链接

01背包

主要思想

1.四个科目需要单独算

2.最佳答案 = sum/2;

每一组数据划分为两部分 使得俩部分的差值最少

3.将每个科目所有题目的总时间的一半作为背包的容量

花费时间看作为体积和价值 ---求出最大值(这个最大值是小于等于sum/2)
4.说明最接近于sum/2的方案,sum-f[sum/2]就是这一科目的最少花费时间

  • f[sum/2]是小于 t/2的最大值,那么 n-f[sum/2]肯定大于等于sum/2
#include <bits/stdc++.h>
using namespace std;

const int N = 60;
int s[5];  //分别存放 4课科目的题数
int v[N];
int f[N*N];
int sum,ans;

int main() {

	for(int i = 1; i <= 4; i ++) cin >> s[i]; //每科目的题数

	for(int i = 1; i <= 4; i ++) {

		memset( f, 0, sizeof(f) ); //每一次计算需要清空背包
		sum = 0;

		for(int j = 1; j <= s[i]; j++) {

			cin >> v[j];  //第 i 科目的第 j 道题花费的时间
			sum += v[j];  //复习第i科目的总时间
		}
		for(int j = 1; j <= s[i]; j ++)
			for(int k = sum / 2; k >= v[j]; k --) {

				f[k] = max(f[k],f[k-v[j]]+v[j]);

			}
			ans += sum - f[sum / 2];
	}
	cout << ans;
	return 0;
}

posted @ 2024-05-19 21:16  LTphy  阅读(164)  评论(1)    收藏  举报