目录
背包问题
背包问题是一个经典的组合优化问题,它描述了如何在给定的容量限制下选择物品以最大化其价值。假设有一个背包,能够承载的最大重量为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;
}
输出结果
执行上述代码后,程序将输出计算得到的最优价值。该值代表在给定的背包容量下,能够获得的最大物品价值。
注意事项
在实现背包问题时,需要注意以下几点:
-
确保物品的重量和价值数组是对应的。
-
在排序过程中,务必保持物品索引的一致性,以防止选择错误的物品。
-
在实际应用中,背包问题可能会面临更复杂的约束条件,需要考虑其他优化策略或算法。
小结:
借鉴:借鉴文章
关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||竞赛资料|| ||课程资料||
添加我的公众号即可: