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

目录

背包问题

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

小结:

借鉴:借鉴文章

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

相关推荐
CYRUS_STUDIO4 小时前
如何防止 so 文件被轻松逆向?精准控制符号导出 + JNI 动态注册
android·c++·安全
CYRUS_STUDIO4 小时前
C&C++ 代码安全再升级:用 OLLVM 给 so 加上字符串加密保护
c++·安全·llvm
岑梓铭4 小时前
计算机网络第四章(4)——网络层《ARP协议》
网络·笔记·tcp/ip·计算机网络·考研·408
矛取矛求4 小时前
日期类的实现
开发语言·c++·算法
lingggggaaaa4 小时前
小迪安全v2023学习笔记(八十讲)—— 中间件安全&WPS分析&Weblogic&Jenkins&Jetty&CVE
笔记·学习·安全·web安全·网络安全·中间件·wps
会开花的二叉树5 小时前
彻底搞懂 Linux 基础 IO:从文件操作到缓冲区,打通底层逻辑
linux·服务器·c++·后端
在下雨5995 小时前
项目讲解1
开发语言·数据结构·c++·算法·单例模式
计算机小手5 小时前
高效 P2P 文件传输工具:FileSync 利用 WebRTC 技术实现极速安全传输
经验分享·docker·webrtc·开源软件
清朝牢弟5 小时前
Win系统下配置PCL库第一步之下载Visual Studio和Qt 5.15.2(超详细)
c++·qt·visual studio
Jayyih5 小时前
嵌入式系统学习Day36(简单的网页制作)
学习·算法