#include<iostream>
#include<array>
#include<algorithm>
using namespace std;
array<int, 5>s;
array<array<int, 21>, 5>A;
int ans;
void input()
{
for (int i = 1; i <= 4; i++)
cin >> s[i];
for (int i = 1; i <= 4; i++)
for (int j = 1; j <= s[i]; j++)
cin >> A[i][j];
}
int solve(int i)
{
array<int, 5005>dynamic_program;
dynamic_program.fill(0);
int sum = 0, n = s[i];
for (int j = 1; j <= n; j++)
sum += A[i][j];
for (int j = 1; j <= n; j++)
for (int room = sum / 2; room >= 0; room--)
if (room >= A[i][j])
dynamic_program[room] = max(dynamic_program[room], dynamic_program[room - A[i][j]] + A[i][j]);
return sum - dynamic_program[sum / 2];
}
int main()
{
input();
for (int i = 1; i <= 4; i++)
ans += solve(i);
cout << ans;
return 0;
}
洛谷P2392 kkksc03考前临时抱佛脚进阶解法
最新推荐文章于 2024-10-30 14:06:59 发布
本文介绍了一个使用动态规划解决背包问题的C++实现方法。通过输入物品数量及每个物品的价值,程序能够计算出接近价值一半的最大可能价值差。该文适用于对动态规划和背包问题感兴趣的读者。
683

被折叠的 条评论
为什么被折叠?



