贪心算法实验(求解背包问题)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法分析与设计实验报告第四次实验

sort(item,item+n,comparison); //实现单位重量的平均价值的物品的排序

for(i=0;i

{x[i]=0,tem[i]=0;};

float c=m;

for(i=0;i

{

if(item[i].w>c)

break;

tem[i]=1;

c-=item[i].w;

}

if(i

tem[i]=c/item[i].w;

for(i=0;i

{

for(int j=0;j

{

if(item[i].w==tmp[j])

x[j]=tem[i];

}

}

}

输入较小的结果:

测试结果

附录:

完整代码(贪心法)

//贪心算法 背包问题

#include

#include

#include

#include

using namespace std;

const int N=10000;

输入较大的结果:

实验心得 首先这个实验,需要注意的点是背包问题与0-1背包不同,物品可以部分的放入背包中,所以思路也不一样,首先就是将物品按照单位质量价值排序,只这一点就有一点难度。难度在于要是排序后物品的编号就会发生改变,输出的就不是之前的编号的物品,导致错误,后来发现如果为每一个物品保存一个副本,

然后将它们的编号进行对比,就可以进行正确的输出了。其中这个实验让我学

到了两点:一是结构体的使用,之前一直没有怎么用过,现在才发现自己其实

不会用;二十对于库函数sort 函数的使用。感觉每一次实验都有学到东西,

很开心。

实验得分 助教签名

struct st{ //定义结构体,用来存放和物品相关的变量float v;

float w;

float perval;

};

void Knapsack(int n,float m,st item[],float x[]); //声明贪心算法求解问题函数

int main()

{

float m;

int n,i;

cout<<"请输入背包的容量:";

cin>>m;

cout<<"请输入物品的个数:";

cin>>n;

st item[N];

float x[N+1];

cout<<"待装物品的重量为:"<

for(i=0;i

cin>>item[i].w;

cout<

cout<<"待装物品的价值为:"<

for(i=0;i

cin>>item[i].v;

cout<

//计算每一个物品的单位重量的价值

for(i=0;i

item[i].perval=item[i].v/item[i].w;

clock_t start,end,over; //计算程序运行时间的算法

start=clock();

end=clock();

over=end-start;

start=clock();

Knapsack(n,m,item,x); //调用贪心算法函数

cout<<"选?择?装Á¡ã下?的Ì?物?品¡¤的Ì?比À¨¨例¤y如¨?下?:

êo"<

for(i=0;i

cout<<"["<

end=clock();

printf("The time is %6.3f",(double)(end-start-over)/CLK_TCK); //显示运行时间

system("pause");

return 0;

}

bool comparison(st a,st b){//自定义函数说明sort函数使用的形式是从大到小排序

return a.perval>b.perval;

}

void Knapsack(int n,float m,st item[],float x[])

{

int i;

float tem[N]; //该变量数组用来记录排好序之后的物品是否被放入背包float tmp[N]; //定义一个数组用来保存以前的编号及重量,用于构造最优解

for(i=0;i

tmp[i]=item[i].w;

sort(item,item+n,comparison); //实现单位重量的平均价值的物品的排序

for(i=0;i

{x[i]=0,tem[i]=0;};

float c=m;

for(i=0;i

{

if(item[i].w>c)

break;

tem[i]=1;

c-=item[i].w;

}

if(i

tem[i]=c/item[i].w;

for(i=0;i

{

for(int j=0;j

{

if(item[i].w==tmp[j])

相关文档
最新文档