算法设计与分析(背包问题

目录

背包问题

背包问题是一个经典的组合优化问题,它描述了如何在给定的容量限制下选择物品以最大化其价值。假设有一个背包,能够承载的最大重量为M,同时有n个物品,每个物品都有其重量和价值。我们的目标是选择一些物品装入背包,使得在不超过背包承重的情况下,所装物品的总价值最大。

问题描述

背包问题通常分为两种类型:0-1背包问题和完全背包问题。在0-1背包问题中,每种物品只能选择一次,而在完全背包问题中,物品可以选择多次。本文将重点介绍0-1背包问题。

具体而言,给定n个物品的重量数组w和价值数组v,以及背包的最大承载重量M,我们需要通过选择部分物品,使得其总重量不超过M,同时总价值最大化。

在这个实现中,我们使用贪心算法,通过将物品按单位重量的价值进行排序,然后逐步选择物品,直至达到背包的最大承载重量。

代码实现

cpp 复制代码
#include <iostream> 
#include<algorithm>
#define N 7

using namespace std;

float z[N+1];
void Sort(int n,float w[],float v[]){
	for(int i=1;i<=n;i++)
		z[i]=v[i]/w[i];
	// 冒泡排序 
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(z[i]<z[j]){
				float temp = z[i];
				z[i] = z[j];
				z[j]=temp;
				float tempw = w[i];
				w[i] = w[j];
				w[j] = tempw;
				float tempv = v[i];
				v[i] = v[j];
				v[j] = tempv; 
			}
		}
	}
}

void Knapsack(int n, float M, float v[], float w[], float x[]){
	/*
	n:物品数量
	M:背包容量
	v:各物品价值
	w:各物品重量 
	x:最优解 
	*/ 
	// 按单位重量价值 从大到小 排好序  
	Sort(n, w, v);
	
	// 初始化最优解 
	for (int i=1; i<=n; i++) x[i] = 0;
	  
	float c = M;	// c:背包剩余容量 
	
	// 逐个装入 
	int i=1; 
	for (; i<=n; i++){
		if (w[i] > c) break;
		x[i] = 1;
		c -= w[i];
	}
	if (i <= n) x[i] = c/w[i];	// 说明是break出来的 
}

int main() {
	// 数据准备 
	float w[N+1] = {0, 35, 30, 60, 50, 40, 10, 25};	// 重量 
	float v[N+1] = {0, 10, 40, 30, 50, 35, 40, 30};	// 价值 
	float x[N+1];
	
	// 背包问题求解 
	Knapsack(N, 150, v, w, x);
	
	// 计算最优值 
	float pi = 0;
	for (int i=1; i<=N; i++){
		pi += v[i] * x[i];
	} 
	
	cout << pi << endl;
}

输出结果

执行上述代码后,程序将输出计算得到的最优价值。该值代表在给定的背包容量下,能够获得的最大物品价值。

注意事项

在实现背包问题时,需要注意以下几点:

  1. 确保物品的重量和价值数组是对应的。

  2. 在排序过程中,务必保持物品索引的一致性,以防止选择错误的物品。

  3. 在实际应用中,背包问题可能会面临更复杂的约束条件,需要考虑其他优化策略或算法。

小结:

借鉴:借鉴文章

关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||竞赛资料|| ||课程资料||
添加我的公众号即可:

相关推荐
赵谨言2 分钟前
基于python 微信小程序的医院就诊小程序
经验分享·python·毕业设计
蹉跎x4 分钟前
力扣1358. 包含所有三种字符的子字符串数目
数据结构·算法·leetcode·职场和发展
yuyanjingtao10 分钟前
CCF-GESP 等级考试 2023年12月认证C++三级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
小码的头发丝、12 分钟前
Java进阶学习笔记|面向对象
java·笔记·学习
坊钰43 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
Purple Coder1 小时前
第6章 图论
笔记
巫师不要去魔法部乱说1 小时前
PyCharm专项训练4 最小生成树算法
算法·pycharm
asyxchenchong8881 小时前
GEE云计算、多源遥感、高光谱遥感技术蓝碳储量估算;红树林植被指数计算及提取
经验分享
asyxchenchong8881 小时前
生态学研究新工具:CASA模型原理解析与MODIS NDVI/FPAR遥感数据处理
经验分享
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习