

思路:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2e2 + 10;
int n, a[N], b[N], sum, f[N][40010], ans;
int main()
{
//freopen("cs.in", "r", stdin);
//freopen("cs.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &a[i], &b[i]);
sum += max(a[i], b[i]);
}
memset(f, 127 / 3, sizeof(f));
ans = f[0][0];
f[0][0] = 0;
for(int i = 1; i <= n; i++) f[i][0] = f[i - 1][0] + b[i];
for(int i = 1; i <= n; i++)
for(int j = sum; j >= 0; j--)
{
if(j < a[i]) f[i][j] = f[i - 1][j] + b[i];
else f[i][j] = min(f[i - 1][j - a[i]], f[i - 1][j] + b[i]);
}
for(int j = 0; j <= sum; j++) ans = min(max(f[n][j], j), ans);
printf("%d\n", ans);
return 0;
}
本文介绍了一个使用动态规划解决最小化成本问题的算法。该算法通过预先计算最大值和最小值,并利用二维数组存储中间结果来避免重复计算,以此达到优化性能的目的。文章详细展示了如何初始化数组、迭代计算每个状态的最优解,并最终找到全局最优解。

211

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



