如果dp[i][j]表示前i块石头填满体积为j的海的最小体力,那么状态转移就应该是dp[i][j]=min(dp[i - 1][j], dp[i - 1][j - k[i]] + m[i]),压成一维也就是dp[j] = min(dp[j], dp[j - k[i]] + m[i]),为什么10分呢?
以下是10分代码
#include <iostream>
#include <cstring>
using namespace std;
int v, n, c, k[10005], m[10005], dp[10005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
cin >> v >> n >> c;
for (int i = 1; i <= n; i++)
cin >> k[i] >> m[i];
for (int i = 1; i <= n; i++)
for (int j = v; j >= k[i]; j--)
dp[j] = min(dp[j], dp[j - k[i]] + m[i]);
if (dp[v] <= c)
cout << c - dp[v] << "\n";
else
cout << "Impossible" << "\n";
return 0;
}