贪心法求解背包问题

简介: 背包问题: 背包问题: 已知背包的容量为M和n件物品。第i件物品的重量为wi,价值为pi,将物品i的一部分xi放进背包即可获得价值pi*xi的价值。

背包问题:

背包问题:
已知背包的容量为M和n件物品。第i件物品的重量为wi,价值为pi,将物品i的一部分xi放进背包即可获得价值pi*xi的价值。问题: 怎样装包使所获得的价值最大?

贪心法核心思想:

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

求解背包问题的贪心原则可能是以下几个:

  1. 每次选价值最大的物品装进背包
  2. 每次都选提及最小的物品装进背包
  3. 每次选单位价值最大的装.

准则1每次装的价值大,但是同时也可能占据了较大的空间;准则2能装的物品多,总价值未必高,按第三种准则装可以实现背包总价值最大.因此将每个物品按单位价值递减排序,先装单位价值高的,最好空间有剩余,装物品的一部分即可。

C++程序实现:

include <iostream>
using namespace std;
//数组按pi/wi由大到小不递增排列
int greedypackage(int p[],int w[],int M,double X[],int n){
     int i; 
     int rc=M;//剩余背包容量,初始化为M;
      for (i = 0; i < n; ++i)
      {
          if(w[i]<=rc){
             X[i]=1;
             rc=rc-w[i];  
          } else{
            break;
          }
      }
      if(i<=n){
           X[i]=(double)rc/w[i];
      }
      for (i = 0; i < n; ++i)
      {
        cout<<X[i]<<"\t";
      }
    return 0;
}

int main(){
  int p[3]={24,15,25};
  int w[3]={15,10,18};//数组w是按wi/pi递减排列的,这一步可以用快速排序实现
  int M=20;
  double A[3]={0,0,0};

   greedypackage(p,w,M,A,3);
   return 0;
}

输出解:

1  0.5  0
目录
相关文章
|
25天前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
55 2
动态规划算法学习三:0-1背包问题
|
1月前
|
存储 算法
算法之背包问题
本文讨论了可分背包问题和0-1背包问题的区别及解决方法,其中可分背包问题可以使用贪心算法解决,而0-1背包问题则通常采用动态规划方法来找到最大价值的解决方案。
40 0
算法之背包问题
|
算法
背包问题之贪心算法
背包问题之贪心算法
80 0
|
存储 算法
【趣学算法】Day3 贪心算法——背包问题
【趣学算法】Day3 贪心算法——背包问题
157 0
|
缓存 算法 网络协议
贪心法
贪心法是把一个复杂问题分解为一系列较为简单的局部最优选择,每一步选择都是对当前解的一个扩展,直到获得问题的完整解。贪心法的典型应用是求解最优化问题,而且对许多问题都能得到整体最优解,即使不能得到整体最优解,通常也是最优解的很好近似。
【动态规划法】0-1背包问题
【动态规划法】0-1背包问题
158 0
【动态规划法】0-1背包问题
|
算法
【贪心法】会场安排问题
【贪心法】会场安排问题
254 0
【贪心法】会场安排问题
|
存储
【贪心法】程序存储问题
【贪心法】程序存储问题
209 0
【贪心法】程序存储问题
|
人工智能 算法
【动态规划】矩阵连乘
完全加括号的矩阵连乘积可递归地定义为: • 单个矩阵是完全加括号的 • 矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C 的乘积并加括号,即A=(BC) 设有四个矩阵A, B, C, D ,它们的维数分别是: A = 50*10 B = 10*40 C = 40*30 D = 30*5 总共有五种完全加括号的方式:
320 0
|
机器学习/深度学习 算法 计算机视觉
【背包问题】基于禁忌搜索算法求解背包问题附Matlab代码
【背包问题】基于禁忌搜索算法求解背包问题附Matlab代码