贪心算法背包问题

#include

#include

#define N 50

typedef struct {

int list;

float p; // 物体的价值

float w; // 物体的重量

float v; // 物体的价值重量比

}Object;

void MERGE(Object A[],int low,int mid,int high)

{

int h,i,j,k;

Object* B=(Object*)malloc((high-low+1)*sizeof(Object));

h=low;i=0; j=mid+1;

while (h

{

if (A[h].v>=A[j].v )

{ B[i]=A[h];h=h+1 ;}

else

{B[i] =A[j]; j=j+1 ;}

i++;

}

if( h>mid)

{

for (k=j;k

{

B[i]=A[k];i=i+1; }

}

else

for (k=h;k

{ B[i] =A[k];i=i+1; }

i=0;

for (k=low;k

{

A[k] =B[i] ;

i++;}

free(B);

}

void MERGESORT(Object array[],int low,int high)

{

int mid;

if( low

{

mid=(low+high)/2;

MERGESORT(array,low,mid) ;

MERGESORT(array,mid+1,high) ;

MERGE(array,low,mid,high) ;

}

}

float knapsack_greedy(float m, Object instance[], float x[], int n){

int i;

float p = 0; // 总价值初始为0

/* 初始化 */

for(i=0; i

instance[i].v = instance[i].p / instance[i].w; // 计算物体价值重量比

x[i] = 0; // 默认放入份量为0

}

/* 对物体进行排序:按v的递减顺序 */

MERGESORT(instance,0,n-1);

/* 填物过程 */

for(i=0; i

if(instance[i].w

x[i] = 1; // 将物体全部装入 置x[i]为1

m -= instance[i].w; // 从剩余载重量中去掉物体的重量

p += instance[i].p; // 总价值加上物体的完整价值

}else{ // 若物体重量大于剩余载重量

x[i] = m / instance[i].w; // 置x[i]为剩余载重量/物体重量:即最大能置入的百分比

p+= x[i]*instance[i].p; // 总价值加上物体装入部分的价值

break; // 此时背包已满,可以退出循环

}

}

return p;

}

void main(){

Object instance[N]; // n个物体的属性

float x[N]; // n个物体装入背包的份量(0

float m; // 背包的最大载重量

int n; // 物体个数

int i;

cout

cin>>m;

cout

cin>>n;

cout

cout

for(i=0; i

cout

instance[i].list=i+1;

cin>>instance[i].p>>instance[i].w;

cout

}

float maxv = knapsack_greedy(m, instance, x, n);

cout

cout

cout

cout

for( i=0; i

cout

cout

cout

}

}

#include

#include

#define N 50

typedef struct {

int list;

float p; // 物体的价值

float w; // 物体的重量

float v; // 物体的价值重量比

}Object;

void MERGE(Object A[],int low,int mid,int high)

{

int h,i,j,k;

Object* B=(Object*)malloc((high-low+1)*sizeof(Object));

h=low;i=0; j=mid+1;

while (h

{

if (A[h].v>=A[j].v )

{ B[i]=A[h];h=h+1 ;}

else

{B[i] =A[j]; j=j+1 ;}

i++;

}

if( h>mid)

{

for (k=j;k

{

B[i]=A[k];i=i+1; }

}

else

for (k=h;k

{ B[i] =A[k];i=i+1; }

i=0;

for (k=low;k

{

A[k] =B[i] ;

i++;}

free(B);

}

void MERGESORT(Object array[],int low,int high)

{

int mid;

if( low

{

mid=(low+high)/2;

MERGESORT(array,low,mid) ;

MERGESORT(array,mid+1,high) ;

MERGE(array,low,mid,high) ;

}

}

float knapsack_greedy(float m, Object instance[], float x[], int n){

int i;

float p = 0; // 总价值初始为0

/* 初始化 */

for(i=0; i

instance[i].v = instance[i].p / instance[i].w; // 计算物体价值重量比

x[i] = 0; // 默认放入份量为0

}

/* 对物体进行排序:按v的递减顺序 */

MERGESORT(instance,0,n-1);

/* 填物过程 */

for(i=0; i

if(instance[i].w

x[i] = 1; // 将物体全部装入 置x[i]为1

m -= instance[i].w; // 从剩余载重量中去掉物体的重量

p += instance[i].p; // 总价值加上物体的完整价值

}else{ // 若物体重量大于剩余载重量

x[i] = m / instance[i].w; // 置x[i]为剩余载重量/物体重量:即最大能置入的百分比

p+= x[i]*instance[i].p; // 总价值加上物体装入部分的价值

break; // 此时背包已满,可以退出循环

}

}

return p;

}

void main(){

Object instance[N]; // n个物体的属性

float x[N]; // n个物体装入背包的份量(0

float m; // 背包的最大载重量

int n; // 物体个数

int i;

cout

cin>>m;

cout

cin>>n;

cout

cout

for(i=0; i

cout

instance[i].list=i+1;

cin>>instance[i].p>>instance[i].w;

cout

}

float maxv = knapsack_greedy(m, instance, x, n);

cout

cout

cout

cout

for( i=0; i

cout

cout

cout

}

}


相关内容

  • 第4章贪心算法(0-算法思想)
  • 第4章 贪心算法 1 学习要点  贪心算法的基本思想  贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质 贪心算法与动态规划算法的差异 正确性的证明 范例学习贪心设计策略 (1)活动安排问题: (4)单源最短路径: (2)最优装载问题: (5)最小生成树: (3)哈夫曼编码: (6) ...

  • 20151112-JWJ-Algorithm-12-贪心算法
  • 湖南大学-算法设计与分析课程 Lecture 12-贪心算法 姜文君 [email protected] 办公室:信息科学与工程学院院楼326 2015-2016第一学期 回 顾 动态规划6案例, 矩阵连乘.最长公共子序列. 最大子段和可扩展. 凸多边形最优三角剖分. 多边形游戏更一般. 0-1背包为经 ...

  • 北大算法分析与设计课件8
  • 第8 章近似算法 8.1 近似算法及其近似比 8.2 多机调度问题 8.2.1 贪心的近似算法 822改进的贪心近似算法8.2.2 8.3 货郎问题 8.3.1 最邻近法 8.3.2 最小生成树法 833最小权匹配法8.3.3 8.4 背包问题 8.4.1 841一个简单的贪心算法 8.4.2 多项 ...

  • 贪心算法背包问题java代码
  • /*贪心算法求得的是局部最优解,而不是整体最优解 *归纳起来就是先求出每个物品的平均价值(也就是价值/重量); *然后再将得出来的每个物品的平均价值降序排序,并记录各自在数组中的位置(即下标) *将排序后的物品重量和价值分别用新数组来存储 *根据背包容量来判断,一件一件装入背包,直到装满为止,在这个 ...

  • 算法实验报告
  • 实验一快速排序 一问题描述 实现对数组的普通快速排序与随机快速排序 二实验要求 (1)实现上述两种排序方法 (2)统计算法运行时间 (3)分析性能差异,做出总结 三算法原理 (1)快速排序原理: 每次将数组最后一个元素作为基准,对待排数组进行分组,使基准元素左边的数据比基准数据要小,右边的数据比基准 ...

  • 算法设计期末总结
  • 第一部分:算法基础 1.算法五个特征: 零个或多个输入.至少一个输出.确定性.能行性.有穷性. 算法就是求解一类问题的任意一种特殊的方法. 联系:算法+数据结构=程序,算法是程序设计的核心,算法的好坏程度上决定了一个程序的效率.一区别:算法是解决问题的步骤,程序是算法的代码实现依靠程序来完成功能,程 ...

  • 2015年算法分析与设计期末考试试卷B卷
  • 西南交通大学2015-2016学年第(一) 学期考试试卷 课程代码3244152课程名称算法分析与设计考试时间120分钟 阅卷教师签字: 填空题(每空1分,共15分) 1. 2. 3. 4. 5. 程序是(1) 用某种程序设计语言的具体实现. 矩阵连乘问题的算法可由(2)设计实现. 从分治法的一般设 ...

  • 动态规划基本原理
  • 动态规划基本原理 近年来,涉及动态规划的各种竞赛题越来越多,每一年的NOI几乎都至少有一道题目需要用动态规划的方法来解决:而竞赛对选手运用动态规划知识的要求也越来越高,已经不再停留于简单的递推和建模上了. 要了解动态规划的概念,首先要知道什么是多阶段决策问题. 一.多阶段决策问题 如果一类活动过程可 ...

  • 求解0-1二次规划问题的迭代禁忌搜索算法
  • 计 算 机 工 程 第卷 第1期 38 Computer Engineering V ol.38 No.1 文章编号:文章编号:1000-3428(2012)01-0140-03 ·人工智能及识别技术·人工智能及识别技术· 2012年1月 January 2012 文献标识码:文献标识码:A 中图分 ...