头歌:聪明的寻宝人

文章讲述了如何使用动态规划方法解决寻宝者在有限重量限制下选择宝物以获取最大总价值的问题。给出了一段C++代码示例,展示了MaxValue函数的实现过程。
摘要由CSDN通过智能技术生成
任务描述

本关任务:计算寻宝人所能带走的宝物的最大价值。

一个寻宝人在沙漠中发现一处神秘的宝藏,宝藏中共有n个宝物(n不超过20),每个宝物的重量不同,价值也不同,宝物i的重量是wi,其价值为vi

寻宝人所能拿走的宝物的总重量为mm不超过50)。请帮助寻宝人写一个程序,计算寻宝人能够获得的最大总价值。

编程要求

在右侧编辑器中有一个函数MaxValue,它有四个参数valuesweightsnm

valuesweights分别存放了n件宝物的价值重量m为寻宝人所能携带的最大重量。

请在这个函数中补充代码,计算并输出寻宝人所能获得的最大总价值。

输入数据由评测系统读取,并传递给MaxValue函数。具体见测试说明

测试说明

平台会对你编写的代码进行测试:

测试输入: 3 10 3 4 4 5 5 6

预期输出: 11

每组输入有多行,第一行有两个数nm,分别为宝石数量寻宝人载重。下面有n行数据,每一行有两个数,分别是宝石重量宝石价值

#include <iostream>
using namespace std;
// 包含必要的头文件

// 定义全局变量 n 和 m,分别表示物品的数量和背包的容量
int n, m;

// 定义函数 MaxValue,用于计算背包能够容纳的最大价值
void MaxValue(int values[], int weights[], int n, int m)
{
    // 定义二维数组 dp 用于保存子问题的解
    int dp[300][300];
    
    // 初始化边界条件
    for (int i = 0; i < 300; i++)
    {
        dp[0][i] = 0;
        dp[i][0] = 0;
    }
 
    // 遍历每个物品
    for (int i = 0; i < n; i++)
    {
        // 遍历背包容量从 1 到 m
        for (int j = 1; j <= m; j++)
        {
            // 如果当前物品的重量小于等于当前背包容量,则可以考虑放入背包
            if (j >= weights[i])
            {
                // 选择放入或不放入当前物品,取价值较大的方案
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i]] + values[i]);
            }
            else
            {
                // 如果当前物品的重量大于当前背包容量,则无法放入背包
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    
    // 输出背包能够容纳的最大价值
    cout << dp[n - 1][m] << endl;
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值