当前位置: 首页 > news >正文

完全背包-一维数组

52. 携带研究材料(第七期模拟笔试)

题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的重量,并且具有不同的价值。

小明的行李箱所能承担的总重量是有限的,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。

输入描述

第一行包含两个整数,n,v,分别表示研究材料的种类和行李所能承担的总重量 

接下来包含 n 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值

输出描述

输出一个整数,表示最大价值。

输入示例
4 5
1 2
2 4
3 4
4 5
输出示例
10
提示信息

第一种材料选择五次,可以达到最大值。

数据范围:

1 <= n <= 10000;
1 <= v <= 10000;
1 <= wi, vi <= 10^9.

思路

与0-1背包的区别是,它的物品数量是无限个,因此是一个完全背包问题,对于这种问题,解决方案只是状态转移方程有变化,变成了dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i])

python题解(二维数组)

def knapsack(n, v, weight, value):
    dp = [[0]*(v+1) for _ in range(n)] #dp表示可以无限次使用物品0-i的前提下,装满容量为j的背包可以获得的最大价值
    for j in range(weight[0], v+1):
        dp[0][j] = dp[0][j-weight[0]]+value[0]
    for i in range(1, n):
        for j in range(1, v+1):
            if j < weight[i]:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-weight[i]]+value[i])
    return dp[n-1][v]
    
n, v = map(int, input().split())
weight = []
value = []
for _ in range(n):
    wi, vi = map(int, input().split())
    weight.append(wi)
    value.append(vi)
max_value = knapsack(n, v, weight, value)
print(max_value)

python题解(一维数组)

注意:与0-1背包不同,要正向遍历

def knapsack(n, v, weight, value):
    dp = [0]*(v+1) #dp表示目前装满容量为j的背包可以获得的最大价值
    for i in range(0, n):
        for j in range(weight[i], v+1):
            dp[j] = max(dp[j], dp[j-weight[i]]+value[i])
    return dp[v]

n, v = map(int, input().split())
weight = []
value = []
for _ in range(n):
    wi, vi = map(int, input().split())
    weight.append(wi)
    value.append(vi)
max_value = knapsack(n, v, weight, value)
print(max_value)

 

相关文章:

  • Apache Commons Lang3 和 Commons Net 详解
  • 【JavaScript】DOM和BOM是什么?
  • VUE3开发-9、axios前后端跨域问题解决方案
  • 1998-2022年各地级市第三产业占GDP比重数据/地级市第三产业占比数据(全市)
  • Leetcode 3472. Longest Palindromic Subsequence After at Most K Operations
  • XGBoost常见面试题(五)——模型对比
  • 如何在rust中解析 windows 的 lnk文件(快捷方式)
  • 23、什么是菱形继承【中高频】
  • el-tree(append与getNode与过滤)、深拷贝deepClone、监听addEventListener、
  • Aruco 库详解:计算机视觉中的高效标记检测工具
  • C++ 接口(抽象类)
  • 深入理解 CAS 与 ABA 问题
  • 基于Docker去创建MySQL的主从架构
  • Xss漏洞问题
  • 特定领域软件架构DSSA
  • 五、数组维度
  • 批量合并 Word 文档,支持合并成一个 Word,也支持按文件夹合并
  • 网络安全技术整体架构 一个中心三重防护
  • 进程间的通信1
  • Jetson Orin 安装 onnxruntime
  • 企业网站建设一般多少钱/引擎搜索入口
  • 网站出现风险如何处理方法/制作网站的app
  • wordpress多主题/长沙优化科技
  • 家政服家政服务网站模板/南昌seo排名
  • 营销型网站(易网拓)/日本粉色iphone
  • 享学课堂 移动互联网开发/昆明seo关键词排名