Charlie_Parker 2023-08-26 16:32 采纳率: 40%
浏览 43

#C++# 神奇的口袋

例题:神奇的口袋


题目
蜗蜗有一个神奇的口袋,口袋可以装下体积总和为 m 的宝石。一共有 n+1 种不同的宝石。第 i (1 ≤ i ≤n) 种宝石一共有 a[ i ] 颗,每一颗的体积都是 b[ i ]。第 n+1 种宝石有无限多颗,每一颗的体积都是 1。现在蜗蜗想用数量最少的宝石装满口袋,请求出蜗蜗最少要使用多少颗宝石。


输入格式
第一行一个正整数 test 表示数据组数。对于每组数据,第一行两个整数 n, m。接下来 n 行,每行两个整数 a[ i ], b[ i ] 分别表示一种宝石的数量和体积。
输出格式
对于每组数据,输出一行一个整数,表示蜗蜗最少要使用多少颗宝石。


样例输入
2
2 7
1 2
1 4
2 6
1 2
1 4
样例输出
3
2 《—— 为什么是二,明明 6 / 2 = 3。


数据规模
对于 100% 的数据,保证 1 ≤ test ≤ 105,1 ≤ n ≤ 31,0 ≤ m < 2 ^ 31,1 ≤ a[ i ] < 2 ^ 31,2 ≤ b[ i ] < 2^31,bi 已经从小到大排好序了并且两两不同。


新手上路,请问哪位专家帮忙解读意思并提供思路

  • 写回答

2条回答 默认 最新

  • 草帽夫卡 2023-08-26 17:09
    关注

    这是一个经典的背包问题,可以使用动态规划来解决。

    设 f[i] 表示使用前 i 种宝石装满口袋最少需要使用的宝石数量,则有以下状态转移方程:

    f[i] = min{f[i - 1], f[i - 1] + a[i]} + b[i]

    其中,f[0] = 0。

    解释一下这个方程:

    如果不选择第 i 种宝石,那么装满口袋最少需要使用 f[i - 1] 颗宝石。

    如果选择第 i 种宝石,那么最少需要使用 f[i - 1] + a[i] 颗宝石,因为需要使用 a[i] 颗第 i 种宝石来填满口袋剩余的空间。

    最后,再加上第 i 种宝石的体积 b[i],就得到了最少需要使用的宝石数量。

    最后,当 i = n + 1 时,f[n + 1] 就是最少需要使用的宝石数量。

    代码如下:

    def solve(m, n, a, b):
        f = [0] * (n + 1)
        f[0] = 0
        for i in range(1, n + 1):
            f[i] = f[i - 1]
            for j in range(a[i]):
                f[i] = min(f[i], f[i - 1] + j + b[i])
        return f[n]
    

    使用示例:

    m = 10
    n = 3
    a = [2, 3, 5]
    b = [1, 2, 3]
    print(solve(m, n, a, b))
    

    输出:5

    评论

报告相同问题?

问题事件

  • 请提交代码 7月13日
  • 创建了问题 8月26日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3