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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 0-1背包(题解) -> 正文阅读

[数据结构与算法]0-1背包(题解)

蒟蒻第二次发题解,望多支持。正文如下:

题目描述:

一个旅行者有一个最多能负载m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。

输入格式:

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。

输出格式:

仅一行,一个数,表示最大总价值。

样例:

【样例输入】

10 4
2  1
3  3
4  5
7  9

【样例输出】

12

问题分析:

????????旅行者需要在背包能够装下的情况上,装上价值最高的东西。那么如何才能装地最多呢?

? ? ? ? 我们可以选择贪心策略:也就需要考虑到三个贪心的基本问题{

? ? ? ? 1.每次放物品时,将价值最大的物品放入背包中,是否能放下且结果最优?(贪心算法中,一般得到的大多都为最优解的近似解)

? ? ? ? 2.每次放重量最小的物品,能否得到最优解?

? ? ? ? 3.每次选取性价比(价格/重量)最高的物品,能否价值最高?

}

? ? ? ? 我们一一分析:(分析时,要考虑到极端情况)//为方便理解,分析全部使用极端情况

? ? ? ? 1.如果选价值最大的物品,但重量也非常大,那就会出现仅能装下一件物品的情况,肯定是不行的(舍弃)

? ? ? ? 2.如果选择重量最小的物品放入,那价值也不一定高,无法在总重限制的情况下保证价值最大(舍弃)

? ? ? ? 3.每次选择性价比最高的的物品,如果可以达到运载总量(m),那么价值是一定最大的(选用!

灵感来了

灵感来了!

?算法设计:

????????1:数据结构及初始化:将n种物品存储在结构体内Three(共包含重量、价格、性价比)中,所以我们要将性价比进行排序。运用sum来存储能够带走的最大价值(千千万万,万万千千要初始化为0啊!!!)。

? ? ? ? 2:根据贪心算法,只需要按照从大到小排好性价比,一直达到背包的容量。在选择性价比高的物品后,判断是否小于m,如果小于m,那么我们就将其放入,否则就继续判断,直到结束。

??图解:

原本物品
物品i12345678910
重量w[i]429558545

5

价值v[i]3818682056715

排序后物品

物品i

2106358947

1

重量w[i]2589545554
价值v[i]8152018867653
性价比p[i]432.521.61.51.41.210.75

伪代码详解:

? ? ? ? (1)数据结构定义:

????????根据算法结构中的结构,先定义结构体Three:

struct Three{

? ? ? ? double w;//每种物品重量

????????double v;//每种物品价值

? ? ? ? double p;//每种物品性价比

}

????????(2)性价比排序:

? ? ? ? ?利用快排函数sort,对性价比进行排序:

sort(begin,end)//参数begin和end表示范围,分别为排序的数组起始地址和尾地址

? ? ? ? ?算法复杂度:

? ? ? ? 时间复杂度:O(nlogn)

? ? ? ? 空间复杂度:O(n)

? ? ? ? 最后附上AC代码?

?

#include<bits/stdc++.h>
using namespace std;
int f[40][210];
int w[40],c[40];
int main() {
	int m,n;
	cin>>m>>n;
	for(int i=1; i<=n; i++) {
		cin>>w[i]>>c[i];
	}
	for(int i=1; i<=n; i++) {
		for(int j=m; j>0; j--) {
			if(w[i]>j) {
				f[i][j]=f[i-1][j];
			} else {
				f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]);
			}

		}
	}
	cout<<f[n][m]<<endl;
	return 0;
}

嗯好,赞👍

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:51:09  更:2021-07-11 16:52:55 
 
开发: 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/25 17:22:31-

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