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 @   LTphy  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示