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;
}
标签:P2392,考前,int,sum,ans,题数,kkksc03,最大值,科目
From: https://www.cnblogs.com/ltphy-/p/18200640