预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验五应用贪心算法求解背包问题 学院:计算机科学与技术专业:计算机科学与技术 学号:班级:姓名: 一、实验内容: 背包问题指的是:有一个承重为W的背包和n个物品,它们各自的重量和价值分别是和(),假设,求这些物品中最有价值的一个子集。如果每次选择 某一个物品的时候,只能全部拿走,则这一问题称为离散(0-1)背包问题;如果每次 可以拿走某一物品的任意一部分,则这一问题称为连续背包问题。 二、算法思想: 首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。 三、实验过程: #include<iostream> usingnamespacestd; structgoodinfo { floatp;//物品效益 floatw;//物品重量 floatX;//物品该放的数量 intflag;//物品编号 };//物品信息结构体 voidInsertionsort(goodinfogoods[],intn)//插入排序,按pi/wi价值收益进行排序,一般教材上按冒泡排序 { intj,i; for(j=2;j<=n;j++) { goods[0]=goods[j]; i=j-1; while(goods[0].p>goods[i].p) { goods[i+1]=goods[i]; i--; } goods[i+1]=goods[0]; } }//按物品效益,重量比值做升序排列 voidbag(goodinfogoods[],floatM,intn) { floatcu; inti,j; for(i=1;i<=n;i++) goods[i].X=0; cu=M;//背包剩余容量 for(i=1;i<n;i++) { if(goods[i].w<cu)//若不超过容量,尽量增加物品 { goods[i].X=1; cu-=goods[i].w;//确定背包新的剩余容量 } else { goods[i].X=0; } for(j=2;j<=n;j++)/*按物品编号做降序排列*/ { goods[0]=goods[j]; i=j-1; while(goods[0].flag<goods[i].flag) { goods[i+1]=goods[i]; i--; } goods[i+1]=goods[0]; } } cout<<"最优解为:"<<endl; for(i=1;i<=n;i++) { cout<<"第"<<i<<"件物品要放:"; cout<<goods[i].X<<endl; } } voidmain() { cout<<"|--------运用贪心法解背包问题---------|"<<endl; intj,n; floatM; goodinfo*goods;//定义一个指针 while(j) { cout<<"请输入物品的总数量:"; cin>>n; goods=newstructgoodinfo[n+1];// cout<<"请输入背包的最大容量:"; cin>>M; cout<<endl; inti; for(i=1;i<=n;i++) { goods[i].flag=i; cout<<"请输入第"<<i<<"件物品的重量:"; cin>>goods[i].w; cout<<"请输入第"<<i<<"件物品的效益:"; cin>>goods[i].p; goods[i].p=goods[i].p/goods[i].w;//得出物品的效益,重量比 cout<<endl; } Insertionsort(goods,n); bag(goods,M,n); cout<<"press<1>torunagian"<<endl; cout<<"press<0>toexit"<<endl; cin>>j; } } 四、实验结果: 对于0-1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。 以上算法的时间和空间复杂度为O(n*n),其中时间复杂度基本已经不能再优化了,但空间复杂度可以优化到O(n)。