首页 > 编程语言 >代码随想录算法训练营第四十一天 | 416. 分割等和子集,● 01背包问题,你该了解这些! 滚动数组 , 01背包问题,你该了解这些!

代码随想录算法训练营第四十一天 | 416. 分割等和子集,● 01背包问题,你该了解这些! 滚动数组 , 01背包问题,你该了解这些!

时间:2024-03-11 18:22:42浏览次数:30  
标签:01 weight nums int 材料 随想录 背包 bagweight dp

 

46. 携带研究材料(第六期模拟笔试) 时间限制:5.000S 空间限制:128MB
题目描述

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

小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

输入描述

第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。

第二行包含 M 个正整数,代表每种研究材料的所占空间。

第三行包含 M 个正整数,代表每种研究材料的价值。

输出描述
输出一个整数,代表小明能够携带的研究材料的最大价值。
输入示例
6 1
2 2 3 1 5 2
2 3 1 5 4 3
输出示例
5
提示信息

小明能够携带 6 种研究材料,但是行李空间只有 1,而占用空间为 1 的研究材料价值为 5,所以最终答案输出 5。

数据范围:
1 <= N <= 5000
1 <= M <= 5000
研究材料占用空间和价值都小于等于 1000


func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { //dp[bgweight] 每个价值的空间,最大价值数 //递推公式, dp[i] = (dp[i],dp[i-weight(1)]+value) // 初始化, 第一列,0,到有空间就放一个位置 //遍历方式,双右到左 //输出结果 var dp []int dp = make([]int, bagweight+1) for i := 0; i < bagweight+1; i++ { if i >= weight[0] { dp[i] = value[0] } } for i := 1; i < len(weight); i++ { for j := bagweight; j >= 0; j-- { if j-weight[i] >= 0 && dp[j] < dp[j-weight[i]]+value[i] { dp[j] = dp[j-weight[i]] + value[i] } } } return dp[bagweight] }

 

46. 携带研究材料(第六期模拟笔试) 时间限制:5.000S 空间限制:128MB
题目描述

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

小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

输入描述

第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。

第二行包含 M 个正整数,代表每种研究材料的所占空间。

第三行包含 M 个正整数,代表每种研究材料的价值。

输出描述
输出一个整数,代表小明能够携带的研究材料的最大价值。
输入示例
6 1
2 2 3 1 5 2
2 3 1 5 4 3
输出示例
5
提示信息

小明能够携带 6 种研究材料,但是行李空间只有 1,而占用空间为 1 的研究材料价值为 5,所以最终答案输出 5。

数据范围:
1 <= N <= 5000
1 <= M <= 5000
研究材料占用空间和价值都小于等于 1000


package main

import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)

func test_2_wei_bag_problem1(weight, value []int, bagweight int) int {
//dp[i][j] 第包括i前的物品,背包为j的最大值
//递推公式, dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[j]]+price[j])
// 初始化, 初始左列,与上行
//遍历方式,左到右,上到下
//输出结果
var dp [][]int
dp = make([][]int, len(weight))
for i := 0; i < len(dp); i++ {
dp[i] = make([]int, bagweight+1)
}
for i := 0; i < bagweight+1; i++ {
if i >= weight[0] {
dp[0][i] = value[0]
}
}
for i := 1; i < len(weight); i++ {
for j := 1; j < bagweight+1; j++ {
ans := dp[i-1][j]
if weight[i] <= j && ans < dp[i-1][j-weight[i]]+value[i] {
ans = dp[i-1][j-weight[i]] + value[i]
}
dp[i][j] = ans
}
}
return dp[len(weight)-1][bagweight]
}

func main() {
var m, n int
fmt.Scan(&m, &n)
materialSpaces := make([]int, m)
inputs := bufio.NewScanner(os.Stdin)
inputs.Scan() //每次读入一行
data := strings.Split(inputs.Text(), " ") //通过空格将他们分割,并存入一个字符串切片
for i := range data {
val, _ := strconv.Atoi(data[i]) //将字符串转换为int
materialSpaces[i] = val
}
inputs.Scan()
materialValues := make([]int, m)
data = strings.Split(inputs.Text(), " ") //通过空格将他们分割,并存入一个字符串切片
for i := range data {
val, _ := strconv.Atoi(data[i]) //将字符串转换为int
materialValues[i] = val
}

weight := materialSpaces
value := materialValues
res := test_2_wei_bag_problem1(weight, value, n)
fmt.Println(res)
}


416. 分割等和子集

  已解答 中等  

相关标签

相关企业  

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

 

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

 

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100

//1. 难点1, 很难想到这是个背包问题 //2. 难点2, sum(nums)/2 这个背包容量 //3. 难点3, 因为容量==价格,所以n容量的最大价格就是n, 所以要永远取最大值, 最后判断是否为n,就是答案 func canPartition(nums []int) bool { //转化为0,1背包问题, nums[i] 即使价格,也是重要, 如果解为 sum(nums)/2 就是成功, sum(nums)/2 就是背包容量 var sumSize int for _, num := range nums { sumSize += num } if sumSize%2 == 1 { return false } packageSize := sumSize / 2 //dp公式, dp[i] 是不是能填充到dp[i]的大小 //递推公式, dp[i] = max(dp[i],dp[i-nums[i]]+nums[i]) //初始化,dp[i] 第一个数据的初始化 //从尾向前遍历 //输出 dp := make([]int, packageSize+1) for i := 0; i < len(dp); i++ { if i >= nums[0] { dp[i] = nums[0] } } for i := 1; i < len(nums); i++ { for j := packageSize; j >= 0; j-- { if j-nums[i] >= 0 && dp[j] < dp[j-nums[i]]+nums[i] { dp[j] = dp[j-nums[i]] + nums[i] } } } return dp[packageSize] == packageSize

标签:01,weight,nums,int,材料,随想录,背包,bagweight,dp
From: https://www.cnblogs.com/suxinmian/p/18066752

相关文章

  • C语言训练2201-2205
    1.C语言编程001–HelloWorld#include<stdio.h>intmain(){printf("Helloworld\n");printf(“早上好,UAV2201同学们!\n");return0;}2.C语言编程002-执行算术运算(程序直接赋值)#include<stdio.h>intmain(void){inta,b,sum;......
  • 代码随想录算法训练营第四十三天|● 1049. 最后一块石头的重量 II ● 494. 目标和
    最后一块石头的重量 II 题目链接:1049.最后一块石头的重量II-力扣(LeetCode)思路:尽可能将石头分成重量相近的两堆,结果一定最小,因此问题可以转换为分割子集。dp[i]的含义是背包容量为i的背包能装下的最大重量,由于题目中最大重量是15000,所以我们申请15001的vector。注意,结果不......
  • Windows Server 2012R2 丢失api-ms-win-crt-runtime-l1-1-0.dll
    在网上搜索了很久,没有现成的帖子可以解决。安装补丁不是提示“一个或多个问题导致了安装失败”就是此更新不适用于你的计算机。最终在微软官网读到补丁安装要遵守一个顺序,在此特地把解决过程分享出来,希望能帮助到苦于搜索的人报错信息 无法启动此程序,因为计算机中丢失api-ms......
  • [oeasy]python0010_怎么用命令行保存文件
    编写py文件......
  • P3878 [TJOI2010] 分金币
    题意有\(n\)枚金币,第\(i\)枚价值为\(s_i\)。分成两部分,使得两部分数量之差不超过\(1\),求价值之差最小是多少。Sol模拟退火!其实这个算法没什么好说的。设当前最优解与当前解的差为\(\DeltaE\)。那么当前状态发生转移的概率为\(P(f(n))=\begin{cases}1,&\text{......
  • Dynamics CRM 2013 常用SQL查询基础数据
    获取实体SELECT*FROMEntityWHERELogicalName='EntityName'获取字段名称SELECTdistinctA.nameAS字段名,L.labelAS显示名,AT.descriptionAS类型,L.ObjectColumnNameAS形式,A.IsNullableAScodefromattributeAINNERJOINlocalizedlabelLONA.Attributei......
  • 在Windows server 2012R2系统安装使用docker
    REF:https://blog.csdn.net/user_san/article/details/121037022需要进行配置,否则无法将端口映射出来,导致连接不上数据库。另外MYSQL8.0签权方式改变,无法通过navicat连接,需要修改ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'123123';FLUSHPRIVILEGES......
  • Dynamics CRM 2013 常用JS脚本
    Xrm.Page.data获取记录的主键Id的值(getId)varId=Xrm.Page.data.entity.getId();获取记录的表的逻辑名称(getEntityName)varentityName=Xrm.Page.data.entity.getEntityName();获取引用记录的查找值(getEntityReference)varerEntity=Xrm.Page.data.entity.getEnt......
  • vs2019单独重新安装python37_64失败解决办法(bilibili上我最早写的是https://www.bilib
    上个周末的时候,我发现用vs2019编写python的时候。代码高亮出现了奇怪的问题,进入解决方案的时候,print还是蓝色的,但是过了几秒钟后就变为黑色了,因此在最开始的时候我试图通过换一个皮肤和在管理扩展里面找扩展来解决,但是还是有相关问题。于是到vs2019对应的python文件夹找问题,目录是......
  • 3101: *【莫比乌斯反演:练习】gcd(i,j)=k的对数[POI2007]ZAP-Queries
    问题给出\(n,m,k\)(\(1\leqn,m,k\leq10^5\)),求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\lbrack\gcd(i,j)=k\rbrack\),即:满足\(1\leqi\leqn\),\(1\leqj\leqm\),且\(\gcd(i,j)=k\)的二元组\((i,j)\)的数量。题解\(\sum\limits_{i=1}......