贪心算法实验(求解背包问题)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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])