为什么不能将背包容量设为海的深度,价值设为体力
查看原帖
为什么不能将背包容量设为海的深度,价值设为体力
932039
lzy20091001楼主2023/7/31 11:09

如果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;
}

2023/7/31 11:09
加载中...