1、实验五 应用贪心算法求解背包问题学院: 计算机科学与技术 专业:计算机科学与技术学号: 班级: 姓名: 一、实验内容:背包问题指的是:有一个承重为 W 的背包和 n 个物品,它们各自的重量和价值分别是 和 ( ) ,假设 ,求这些物品中最有价值的一个子集。如果每次iwiv1n1niw选择某一个物品的时候,只能全部拿走,则这一问题称为离散(0-1)背包问题;如果每次可以拿走某一物品的任意一部分,则这一问题称为连续背包问题。二、算法思想:首先计算每种物品单位重量的价值 Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过
2、 C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。三、实验过程:#include using namespace std;struct goodinfofloat p; /物品效益float w; /物品重量float X; /物品该放的数量int flag; /物品编号;/物品信息结构体void Insertionsort(goodinfo goods,int n)/插入排序,按 pi/wi 价值收益进行排序,一般教材上按冒泡排序int j,i;for(j=2;jgoodsi.p)goodsi+1=goodsi;i-;goodsi+1=good
3、s0;/按物品效益,重量比值做升序排列void bag(goodinfo goods,float M,int n) float cu;int i,j;for(i=1;in;goods=new struct goodinfo n+1;/coutM;coutgoodsi.w;coutgoodsi.p;goodsi.p=goodsi.p/goodsi.w;/得出物品的效益,重量比cout to run agian“ to exit“j;四、实验结果:对于 0-1 背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。以上算法的时间和空间复杂度为 O(n*n),其中时间复杂度基本已经不能再优化了,但空间复杂度可以优化到 O(n)。