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

目录

背包问题

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

小结:

借鉴:借鉴文章

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

相关推荐
二进制的Liao4 分钟前
【编程】脚本编写入门:从零到一的自动化之旅
数据库·python·算法·自动化·bash
BullSmall28 分钟前
《道德经》第五十八章
学习
自然数e33 分钟前
C++多线程【线程管控】之线程转移以及线程数量和ID
开发语言·c++·算法·多线程
摇滚侠1 小时前
Vue 项目实战《尚医通》,预约挂号的路由与静态搭建,笔记36
javascript·vue.js·笔记
三品吉他手会点灯1 小时前
STM32F103学习笔记-16-RCC(第4节)-使用 HSI 配置系统时钟并用 MCO 监控系统时钟
笔记·stm32·单片机·嵌入式硬件·学习
云在Steven1 小时前
在线确定性算法与自适应启发式在虚拟机动态整合中的竞争分析与性能优化
人工智能·算法·性能优化
Lester_11011 小时前
嵌入式学习笔记 - 关于看门狗定时器的喂狗的操作放在中断还是放在主循环
笔记·单片机·学习
前进的李工2 小时前
LeetCode hot100:234 回文链表:快慢指针巧判回文链表
python·算法·leetcode·链表·快慢指针·回文链表
sin_hielo2 小时前
leetcode 3228
算法·leetcode
缪懿2 小时前
JavaEE:多线程基础,多线程的创建和用法
java·开发语言·学习·java-ee