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

目录

背包问题

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

小结:

借鉴:借鉴文章

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

相关推荐
NAGNIP24 分钟前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队1 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
River4163 小时前
Javer 学 c++(十三):引用篇
c++·后端
感哥5 小时前
C++ std::set
c++
Fanxt_Ja6 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下6 小时前
最终的信号类
开发语言·c++·算法
_落纸6 小时前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记
茉莉玫瑰花茶6 小时前
算法 --- 字符串
算法
博笙困了6 小时前
AcWing学习——差分
c++·算法
NAGNIP6 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法