背包问题贪心算法解决

贪心算法求解背包问题

一、 实验内容

有一个承重为W的背包和n个物品,它们各自的重量和价值分别是wi和vin

Wwi求这些物品中最有价值的一个子集。如果每次选择某(1

i1一个物品的时候,只能全部拿走,则这一问题称为离散(0-1)背包问题;如果每次

可以拿走某一物品的任意一部分,则这一问题称为连续背包问题。

二、 算法思想

首先计算出物品单位重量的价值vi/wi,并排序,依贪婪策略,从物品中选择可装入背包的vi/wi值最大的物品。若该物品装入背包后,背包中物品总重量未超过背包最大承重m,则选择单位重量价值次之的物品装入背包,依次策略进行下去,直到背包装满为止。

三、 实验过程(C++)

#include

using namespace std;

//n表示背包可以存放物品的种类

//指针p指向存放物品价值的数组

//指针q指向存放物品重量的数组

void sort(int n,float *p,float *q)

{

int i;

int j;

for(i=0;i

for(j=i+1;j

if((*(p+i))/(*(q+i))

{

float f;

f=*(p+i);

*(p+i)=*(p+j);

*(p+j)=f;

f=*(q+i);

*(q+i)=*(q+j);

*(q+j)=f;

}

}

void bag(int n,float m,float *v,float *w,float *x)

{

sort(n,v,w);

int i;

for(i=0;i

{

if(*(w+i)>m)

break;

*(x+i)=1;//可以存放该物品时,置1

m-=*(w+i);//放入后,背包的容量减少

}

//当此时背包的容量不够存放整个物品的情况时,存放一部分 if(i

*(x+i)=m/(*(w+i));

if(*(x+i)!=1)

*(x+i)=0;

}

int main()

{

int m ,n,i;

cout

cin>>m;

cout

cin>>n;

float *w=new float[n];

float *v=new float[n];

float *x=new float[n];

cout

for(i=0;i

cin>>w[i];//各种物品的重量

cout

for(i=0;i

cin>>v[i];//各种物品的价值

for(i=0;i

*(x+i)=0;

bag(n,m,v,w,x);

cout

for(i=0;i

cout

cout

for(i=0;i

cout

cout

for(i=0;i

cout

cout

return 0;

}

四、 实验结论

输入背包容量:

50

输入物品种类:

3

输入各种物品的重量:

26 23 15

输入各种物品的价值:

18 15 10

1表示要放入:

0表示不放入:

物品容量内容:26 15 23

物品价值内容:18 10 15

物品存放情况:1 1 0

五、 算法复杂度分析

时间复杂度为O(n2);

Tsort = O(在此处键入公式。nlogn); Tf(for循环复杂度为) =n2;

T = sort + Tf = O(nlogn) + O(n2) = O(n2).

贪心算法求解背包问题

一、 实验内容

有一个承重为W的背包和n个物品,它们各自的重量和价值分别是wi和vin

Wwi求这些物品中最有价值的一个子集。如果每次选择某(1

i1一个物品的时候,只能全部拿走,则这一问题称为离散(0-1)背包问题;如果每次

可以拿走某一物品的任意一部分,则这一问题称为连续背包问题。

二、 算法思想

首先计算出物品单位重量的价值vi/wi,并排序,依贪婪策略,从物品中选择可装入背包的vi/wi值最大的物品。若该物品装入背包后,背包中物品总重量未超过背包最大承重m,则选择单位重量价值次之的物品装入背包,依次策略进行下去,直到背包装满为止。

三、 实验过程(C++)

#include

using namespace std;

//n表示背包可以存放物品的种类

//指针p指向存放物品价值的数组

//指针q指向存放物品重量的数组

void sort(int n,float *p,float *q)

{

int i;

int j;

for(i=0;i

for(j=i+1;j

if((*(p+i))/(*(q+i))

{

float f;

f=*(p+i);

*(p+i)=*(p+j);

*(p+j)=f;

f=*(q+i);

*(q+i)=*(q+j);

*(q+j)=f;

}

}

void bag(int n,float m,float *v,float *w,float *x)

{

sort(n,v,w);

int i;

for(i=0;i

{

if(*(w+i)>m)

break;

*(x+i)=1;//可以存放该物品时,置1

m-=*(w+i);//放入后,背包的容量减少

}

//当此时背包的容量不够存放整个物品的情况时,存放一部分 if(i

*(x+i)=m/(*(w+i));

if(*(x+i)!=1)

*(x+i)=0;

}

int main()

{

int m ,n,i;

cout

cin>>m;

cout

cin>>n;

float *w=new float[n];

float *v=new float[n];

float *x=new float[n];

cout

for(i=0;i

cin>>w[i];//各种物品的重量

cout

for(i=0;i

cin>>v[i];//各种物品的价值

for(i=0;i

*(x+i)=0;

bag(n,m,v,w,x);

cout

for(i=0;i

cout

cout

for(i=0;i

cout

cout

for(i=0;i

cout

cout

return 0;

}

四、 实验结论

输入背包容量:

50

输入物品种类:

3

输入各种物品的重量:

26 23 15

输入各种物品的价值:

18 15 10

1表示要放入:

0表示不放入:

物品容量内容:26 15 23

物品价值内容:18 10 15

物品存放情况:1 1 0

五、 算法复杂度分析

时间复杂度为O(n2);

Tsort = O(在此处键入公式。nlogn); Tf(for循环复杂度为) =n2;

T = sort + Tf = O(nlogn) + O(n2) = O(n2).


相关文章

  • 贪心算法的应用
  • 贪心算法的应用 课程名称: 院 系: 学生姓名: 学 号: 专业班级: 指导教师: 201312-27 贪心算法的应用 摘 要:顾名思义,贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义 ...查看


  • 基于贪心算法的0_1背包问题
  • ISSN1009-3044第6卷第35期(2010年12月)与技术ComputerKnowledgeandTechnology电脑知识 Vol.6,No.35,December2010,pp.10061-10062E-mail:xsjl@c ...查看


  • 算法设计与分析论文
  • 贪心算法 --不在贪心中爆发,就在贪心中灭亡 武汉理工大学计算机科学与技术学院班 摘要 本文介绍贪心算法的基本意义以及算法的使用范围,并通过具体的案例来分析贪心算法的具体应用,从而指出其特点和存在问题. 关键字:贪心算法,贪心策略,TSP. ...查看


  • 算法设计与分析复习题目及答案
  • 分治法 1.二分搜索算法是利用( 分治策略)实现的算法. 9. 实现循环赛日程表利用的算法是(分治策略 ) 27.Strassen矩阵乘法是利用(分治策略 )实现的算法. 34.实现合并排序利用的算法是(分治策略 ). 实现大整数的乘法是利 ...查看


  • 2013计算机算法设计与分析期终考试复习题
  • 计算机算法设计与分析复习题 一.填空题 1.一个算法复杂性的高低体现在计算机运行该算法所需的时间和存储器资源上,因此算法的复杂性有 时间 复杂性和空间复杂性之分. 2.出自于"平衡子问题"的思想,通常分治法在分割原问题, ...查看


  • 贪心算法 实验二报告
  • 实验二 贪心选择算法 姓名 : 田圆圆 学号:2013125135 一.实验目的与要求: 理解贪心选择算法的思想. 二.预习与准备:贪心选择算法思想: (1)贪心选择能得到问题的最优解,要证明我们所做的第一步选择一定包含在一个最优解总,即存 ...查看


  • 贪心算法背包问题 1
  • 算法设计与分析实验报告 题目:贪心算法 背包问题 专业:JAVA技术09--02班 学号:[1**********]1 姓名:柏顺顺 指导老师:宋胜利 实验三:贪心算法 背包问题 一.实验目的与要求 1.掌握背包问题的算法 2.初步掌握贪心 ...查看


  • 计算机算法分析与设计+++论文2
  • 河北科技师范学院 欧美学院 算法设计与分析个人总结 指导教师 院 系 班 级 学生姓名 学 号 引言:对于计算机科学来说,算法分析与设计是至关重要的.在一个大型软件系统的开发中,设计出有效的算法将起到决定性的作用.通俗的讲,算法是解决问题的 ...查看


  • 贪心算法思想
  • 贪心算法思想 顾名思义,贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对 ...查看


热门内容