首先,我们可以将这个问题转化为一个背包问题。考虑到杰克船长要求装满背包,我们可以使用动态规划来解决。

首先,我们可以定义一个二维数组dp,其中dp[i][j]表示前i堆金币装入承重量为j的背包时,所能取得的最小总价值。

对于每一堆金币,我们有两种选择:装入背包或者不装入背包。如果我们选择装入第i堆金币,那么背包的剩余承重量为 j - mi,所以我们可以更新dp[i][j]为 dp[i-1][j-mi] + vi。如果我们选择不装入第i堆金币,那么背包的剩余承重量为 j,所以我们可以更新dp[i][j]为 dp[i-1][j]。

最后,dp[N][T]就表示了杰克船长所能拿走的最少价值的金币。

下面是C++的代码实现:

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

double pirateTreasure(int N, int T, vector<int>& m, vector<int>& v) {
    vector<vector<double>> dp(N+1, vector<double>(T+1, 0.0));

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= T; j++) {
            if (j >= m[i-1]) {
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-m[i-1]] + v[i-1]);
            } else {
                dp[i][j] = dp[i-1][j];
            }
        }
    }

    return dp[N][T];
}

int main() {
    int N, T;
    cin >> N >> T;

    vector<int> m(N);
    vector<int> v(N);

    for (int i = 0; i < N; i++) {
        cin >> m[i] >> v[i];
    }

    double result = pirateTreasure(N, T, m, v);
    cout << fixed << setprecision(2) << result << endl;

    return 0;
}

输入样例解释: N = 4,T = 50,有4堆金币,承重量为50。 第一堆金币的重量为10,价值为60; 第二堆金币的重量为20,价值为100; 第三堆金币的重量为30,价值为100; 第四堆金币的重量为15,价值为45。

输出样例解释: 杰克船长最少可以拿走的金币总价值为170.00

C++题目描述最厉害的加勒比海盗杰克船长驾驶着他的黑珍珠号海盗船找到了一个装满宝藏的藏宝洞。藏宝洞里面有 NN≤100 堆金币第 i堆金币的总重量和总价值分别是 mivi1≤mivi≤100。黑珍珠号的承重量为 TT≤1000。为了长远发展所以他决定带走尽可能少价值的金币但是他要求必须装满。所有金币都可以随意分割分割完的金币重量价值比也就是单位价值不变。请问杰克船长最少可以拿走多少价值的金币?输入

原文地址: https://www.cveoy.top/t/topic/h4zm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录