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

目录

背包问题

背包问题是一个经典的组合优化问题,它描述了如何在给定的容量限制下选择物品以最大化其价值。假设有一个背包,能够承载的最大重量为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. 在实际应用中,背包问题可能会面临更复杂的约束条件,需要考虑其他优化策略或算法。

小结:

借鉴:借鉴文章

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

相关推荐
Felven7 分钟前
B. Skibidus and Ohio
算法
yonuyeung12 分钟前
代码随想录算法【Day54】
java·数据结构·算法
日记成书13 分钟前
详细介绍嵌入式硬件设计
嵌入式硬件·深度学习·学习
Ljw...17 分钟前
DeepSeek+Kimi生成高质量PPT
数据库·c++·powerpoint·ppt·deepseek
敲上瘾18 分钟前
基础dp——动态规划
java·数据结构·c++·python·算法·线性回归·动态规划
SRA.22 分钟前
STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)
笔记·stm32·嵌入式硬件
Dawndddddd25 分钟前
网络安全之攻防笔记--通用安全漏洞SQL注入&sqlmap&Oracle&mongodb&DB2
笔记·sql·安全·web安全
技术小齐30 分钟前
网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战
运维·网络·学习
西猫雷婶36 分钟前
python学智能算法(三)|模拟退火算法:深层分析
算法·机器学习·模拟退火算法
Dongwoo Jeong39 分钟前
类型系统下的语言分类与类型系统基础
java·笔记·python·lisp·fortran·type