题解:B4177 [BCSP-X 2024 6 月初中组] 尽量接近
我写的和别的题解思路不大一样,但是纯正的 01 背包。状态定义与 01 背包相同,不会 01 背包就去搜搜吧,这里就不赘述了。
题目传送门
题意
从
思路
我们设题目所给的原序列为
代码
#include <bits/stdc++.h>
using namespace std;
int n, k, sum, ans, a[60], f[1000010];
int dp(int x) // x 为总容量
{
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++)
for (int j = x; j >= a[i]; j--)
f[j] = max(f[j], f[j - a[i]] + a[i]);
return f[x];
}
int main()
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]), sum += a[i];
if (sum <= k)
printf("%d", sum);
else
{
if (abs(k - dp(k)) <= abs(k - (sum - dp(sum - k))))
printf("%d", dp(k)); // 这里 dp(k) 一定小于 sum - dp(sum - k)
else
printf("%d", sum - dp(sum - k));
}
return 0;
}
题解来之不易,且看且珍惜。给个赞再走吧。
题目传送门