IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法 01背包问题 -> 正文阅读

[数据结构与算法]算法 01背包问题

package bagProblem

import "fmt"

func BagProblem1(weight, value []int, bagweight int) int {
	// 定义一个dp[i][j],表示将任意0-i物品放入包后,在包j重量时,包中的价值最大
	// 初始化dp都为0
	dp := make([][]int, len(weight))
	for i := 0; i < len(weight); i++ {
		// 这里为bagweight+1,表示重量从0开始到bagweight
		dp[i] = make([]int, bagweight+1)
	}

	// 初始化0号物品
	for j := 0; j <= bagweight; j++ {
		// 表示包能放下0号商品
		if weight[0] <= j {
			dp[0][j] = value[0]
		}
	}

	// 第i个商品放入j重量的包时,会有两种情况
	// 放入i的商品后,总重量超过了j,则此时包中的价值和放入i前相同 即 dp[i-1][j]
	// 放入i的商品后,总重量没超过j,此时包中的价值为 dp[i-1][j-weight[i]]+value[i]
	// 其中dp[i-1][j-weight[i]]代表没放入i时的最大价值
	// 状态转移方程为
	// dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i])

	for i := 1; i < len(weight); i++ {
		for j := 1; j <= bagweight; j++ {
			if weight[i] > j {
				dp[i][j] = dp[i-1][j]
			} else {
				dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i])
			}
		}
	}

	return dp[len(weight)-1][bagweight]
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

// 压缩成一维数组
func BagProblem2(weight, value []int, bagweight int) int {
	// 定义一个dp[j],在包j重量时,包中的最大价值
	// 初始化dp都为0
	dp := make([]int, bagweight+1)

	// 第i个商品放入j重量的包时,会有两种情况
	// 不放物品i,则此时包中的价值和放入i前相同 即 dp[j]
	// 放入物品i,此时包中的价值为 dp[j-weight[i]]+value[i]、
	// 状态转移方程为
	// dp[j] = max(dp[j], dp[j-weight[i]]+value[i])

	// 不能先遍历重量,再遍历商品
	// 商品0的重量为1
	// 例如求dp[4]时,j=4,i=0,需要由max(dp[4], dp[4 - weight[0]] + value[0]),即max(dp[4],dp[3] +value[0])
	// 如果先遍历重量后遍历商品时会发现,dp[3]永远为0,说明每次都只取一个商品(因为dp[3]为初始化值,表示没有取过商品,进而表示每次只取一个商品)
	for i := 0; i < len(weight); i++ {
		for j := bagweight; j >= 0; j-- {
			fmt.Println(i)
			if j < weight[i] {
				dp[j] = dp[j]
			} else {
				dp[j] = max(dp[j], dp[j-weight[i]]+value[i])
			}
			fmt.Println(dp)

		}
	}

	return dp[bagweight]
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:44:27  更:2022-05-05 11:47:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:57:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码