题解:P12189 [蓝桥杯 2025 省 Java A/研究生组] 甘蔗
A7F3jK9pR0xf_ · · 题解
题目传送门
思路
最优化问题,考虑动态规划。
我们发现
接下来考虑初始化,显然
接下来考虑状态转移。由于是二维,我们肯定要枚举一个
这样做的复杂度是
虽然足以通过,但我们还可以继续优化复杂度。观察数据范围,我们发现
这样做的时间复杂度为
代码
#include <bits/stdc++.h>
using namespace std;
#define il inline
const int N = 510, M = 1e3 + 10;
int dp[N][M], a[N], b[N], n, m;
bool vis[M];
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;++i)
scanf("%d", &a[i]);
for(int i = 1;i <= m;++i)
scanf("%d", &b[i]);
memset(dp, 0x3f, sizeof(dp));
for(int i = 0;i <= a[1];++i)
dp[1][i] = (i < a[1]);
for(int i = 2;i <= n;++i)
{
for(int j = 0;j <= a[i];++j)
{
for(int k = 1;k <= m;++k)
{
int x1 = b[k] + j, x2 = j - b[k];
if(x1 >= 0)
dp[i][j] = min(dp[i][j], dp[i - 1][x1] + (j < a[i]));
if(x2 >= 0)
dp[i][j] = min(dp[i][j], dp[i - 1][x2] + (j < a[i]));
}
}
}
int ans = dp[0][0];
for(int i = 0;i <= a[n];++i)
ans = min(ans, dp[n][i]);
if(ans < dp[0][0]) // 特判无解
cout << ans;
else
cout << -1;
return 0;
}