贪婪算法之0/1背包问题+读数据结构算法与应用-C++语言描述

原创 2011年10月13日 20:04:26

给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。

 

解决方案:价值密度Pi / Wi(Pi表示第i件物品的价值,Wi表示第i物品的重量)贪婪算法,这种选择准则为:从剩余物品中选择可装入包的Pi / Wi值最大的物品。

 

0/1背包问题是一个NP复杂问题(NP完全问题,是世界七大数学难题之一。 NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题)。对于这类问题,也许根本就不可能找到具有多项式时间的算法。虽然按Pi/Wi非递(增)减的次序装入物品不能保证得到最优解,但它是一个直觉上近似的解。我们希望它是一个好的启发式算法,且大多数时候能很好地接近最后算法。

 

代码实现(摘自http://www.cnblogs.com/gentleming/archive/2010/07/17/1779515.html):

#include <stdio.h>
#include <iostream>
#include<stdlib.h>
#define MAXSIZE 100 //假设物体总数
#define M 15 //背包的载荷能力
using namespace std;

//算法核心,贪心算法
void GREEDY(float w[], float x[], int sortResult[], int n)
{   
 float c = M;   
 int i = 0;   
 int temp = 0;   
 for (i = 0; i < n; i++)//准备输出结果   
 {       
  x[i] = 0;   
 }   
 for (i = 0; i < n; i++)   
 {      
  for(int j=0;j<n;j++)           
   if(sortResult[j]==i+1)           
   {               
    temp = j;//得到取物体的顺序               
    break;           
   }      
   if (w[temp] > c)      
   {           
    break;       
   }       
   x[temp] = 1;//若合适则取出       
   c -= w[temp];//将容量相应的改变   
 }   
 if (i <= n)//使背包充满   
 {       
  x[temp] = c / w[temp];//取某件物品的一部分  
 }   
 return;
}

void sort(float x[], int sortResult[], int n)
{   
 int i = 0, j = 0;  
 int index = 0, k = 0;   
 for (i = 0; i < n; i++)//对映射数组赋初值0   
 {      
  sortResult[i] = 0;  
 }   
 for (i = 0; i < n; i++)   
 {      
  float temp = 0;       
  index = i;       
  //找到性价比最高的商品,并保存下标       
  for (j = 0; j < n; j++)       
  {           
   if ((temp < x[j]) && (sortResult[j] == 0))           
   {               
    temp = x[j];               
    index = j;           
   }       
  }       
  //对w[i]作标记           
  if (sortResult[index] == 0)           
  {               
   sortResult[index] = ++k;           
  }  
 }  
 cout<<"映射数组sortResult:"<<endl;   
 for (i = 0; i < n; i++)      
  cout<<sortResult[i]<<"  ";
 return;
}

//得到本算法的所有输入信息
void getData(float p[], float w[], int *n)
{   
 int i = 0;   
 printf("please input the total count of object: ");   
 scanf("%d", n);  
 printf("Please input array of p :\n"); 
 for (i = 0; i < (*n); i++)   
 {       
  scanf("%f", &p[i]);   
 }   
 printf("Now please input array of w :\n");   
 for (i = 0; i < (*n); i++)   
 {      
  scanf("%f", &w[i]);   
 }   
 return;
}

void output(float x[], int n)
{  
 int i;   
 printf("\n\nafter arithmetic data: advise method\n");   
 for (i = 0; i < n; i++)   
 {
  printf("x[%d]\t", i);   
 }   
 printf("\n");   
 for (i = 0; i < n; i++)   
 {      
  printf("%2.3f\t", x[i]);  
 }   
 return;
}

int main()
{   
 float p[MAXSIZE], w[MAXSIZE], x[MAXSIZE];   
 int i = 0, n = 0;   
 int sortResult[MAXSIZE];   
 getData(p, w, &n); //获取数据   
 for (i = 0; i < n; i++)   
 {       
  x[i] = p[i] / w[i];//得到每件物品的单位重量的价值   
 }   
 sort(x, sortResult, n);//得到映射数组,数组中按照物品单位重量的价值从大到小的顺序做了标记,方便取物品  
 GREEDY(w, x, sortResult, n);//按照映射数组标记的顺序取物品,和总重量比较   
 output(x, n);   

 system("PAUSE");
 return 0;
}

 

 

 

0/1背包问题 - 贪心算法

0/1背包问题 - 贪心算法flyfish贪心算法,贪婪算法,greedy algorithm《数据结构、算法与应用(C++语言描述)》 在贪婪算法(Greedy Algorithm)中,我...
  • flyfish1986
  • flyfish1986
  • 2017-06-24 21:11:45
  • 366

算法——贪心算法解0-1背包问题

问题的描述我们先根据一个贪心算法的经典应用实例,然后给出贪心算法的实现步骤与关键环节,最后给出C++代码求解0-1背包问题。 背包问题(Knapsack Problem):有NN件物品有一个承重(...
  • lanchunhui
  • lanchunhui
  • 2015-11-21 10:57:27
  • 1647

贪心算法实现0-1背包问题,包含k阶优化

  • 2010年12月15日 15:52
  • 275KB
  • 下载

0-1背包问题(贪心算法)C语言源程序

  • 2010年04月22日 10:19
  • 2KB
  • 下载

C++实现贪婪算法解决背包问题

  • 2012年04月22日 19:03
  • 228KB
  • 下载

贪婪算法之货箱装船+读数据结构算法与应用-C++语言描述

算法思想:在贪婪算法(greedy method)中采用逐步构造最优解的方法。在每个阶段,都做出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪婪决策的依据称为贪婪准则(gr...
  • hezhch123
  • hezhch123
  • 2011-10-12 01:30:19
  • 570

搜索算法 读数据结构算法与应用-C++语言描述

  • hezhch123
  • hezhch123
  • 2011-11-03 21:32:26
  • 310

0-1背包问题与动态规划的C/C++代码

那一年, 非计算机专业的我听到0-1背包和动态规划, 觉得很高大上, 其实, 动态规划无非就是寻找高中数学中所说的递推公式而已。最近又复习到0-1背包问题和动态规划, 所以打算用代码来玩玩。   ...
  • stpeace
  • stpeace
  • 2015-06-30 23:53:26
  • 16503

0/1背包问题 - 动态规划(C++实现)

0 / 1背包问题 - 动态规划(C++实现)flyfish以下代码在VC++2013下编译通过#include "stdafx.h" #include #include #include st...
  • flyfish1986
  • flyfish1986
  • 2017-06-20 11:09:28
  • 589
收藏助手
不良信息举报
您举报文章:贪婪算法之0/1背包问题+读数据结构算法与应用-C++语言描述
举报原因:
原因补充:

(最多只允许输入30个字)