现在的位置: 首页 > 综合 > 正文

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

2013年08月17日 ⁄ 综合 ⁄ 共 898字 ⁄ 字号 评论关闭

 利用贪心算法解决0/1背包问题时,需要确定装入的原则,大致可分三类:按重量的大小,按价值的大小,按价值与重量比的大小来确定装入的顺序。

设有5个物品,重量分别为 2 2 6 5 4 ,价值分别为 6 3 5 4 6,背包的最大容量为 10。

1. 按重量从小到大装入时:

   可装入第1 2 5 三个物品, 价值为 15

2.按价值从大到小装入时:

  可装入第1 5  2 三个物品,价值为 15

3.按价值至重量比装入时:

  可装入第1 2 5 三个物品,价值为 15

 

一般按价值重量比装入时,算法要优一些(本人举例欠佳),程序实现如下:

 

#include <stdio.h>

#define N 5
#define M 10

typedef struct
{
 int num;
 int w;
 int p;
 double v;
 int s;
}item;

void sort(item a[], int n)
{
 int i, j;
 item temp;

 for (i = 0; i < n; i++)
 {
  for (j = i; j < n; j++)
  {
   if (a[i].v < a[j].v)
   {
    
    temp = a[i];
    a[i] = a[j];
    a[j] = temp;
   }
  }
 }
}

int main(void)
{
 item a[N] = {{1, 2, 6, 0, 0}, {2, 2, 3, 0, 0}, {3, 6, 5, 0, 0},
 {4, 5, 4, 0, 0}, {5, 4, 6, 0, 0}};
 int i = 0;
 int m = M;
 int V = 0;

 for (i = 0; i < N; i++)
 {
  a[i].v = (double)a[i].p / a[i].w;
 }

 sort(a, N);

 for (i = 0; i < N; i++)
 {
  if (a[i].w <= m)
  {
   a[i].s = 1;
   m = m - a[i].w;
   V = V + a[i].p;
  }
 }
 
 printf("装入的物品重量为: %d,    价值为: %d\n",M-m, V);
 printf("选中的物品编号分别为: ");

 for (i = 0; i < N; i++)
 {
  if (1 == a[i].s)
   printf(" %d ", a[i].num);
 }
 printf("\n");

 return 0;
}

 

【上篇】
【下篇】

抱歉!评论已关闭.