用蛮力法动态规划法和贪心法求解01背包问题.docx
《用蛮力法动态规划法和贪心法求解01背包问题.docx》由会员分享,可在线阅读,更多相关《用蛮力法动态规划法和贪心法求解01背包问题.docx(12页珍藏版)》请在冰点文库上搜索。
用蛮力法动态规划法和贪心法求解01背包问题
算法设计与分析
项目名称:
用蛮力法、动态规划法和贪心法求解0/1背包问题
作者姓名:
余武丹
李红波
刘红梅
完成日期:
2013年9月20日
第1章:
简介(Introduction)
第2章:
算法定义(AlgorithmSpecification)
第三章:
测试结果(TestingResults)
第四章:
分析和讨论
第1章:
简介(Introduction)
0/1背包问题是给定n个重量为{w1,w2,…,wn}、价值为{v1,v2,…,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中。
在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。
根据问题的要求,有如下约束条件和目标函数:
(式1)
(式2)
于是,问题归结为寻找一个满足约束条件式1,并使目标函数式2达到最大的解向量X=(x1,x2,…,xn)。
背包的数据结构的设计:
typedefstructobject
{
intn;*a[i][j];
sv=sv+wp[j].v*a[i][j];
}
if(sw<=c)
cw[i]=sv;
else
cw[i]=0;
}
在可行解中找出最优解,即找出可行解中满足目标函数的最优解。
以下是找出最优解的算法:
intfindmax(intx[16][4],intcv[])
;/wp[k-1].w=wp[k-1].v;
=wp[k-1].w;
wp[k-1].n=wp[k].n;
wp[k-1].v=wp[k].v;
wp[k-1].w=wp[k].w;
wp[k].n=;
wp[k].v=;
wp[k].w=;
flag=1;
}
}
if(flag==0)break;
}
}
然后再用贪心策略选择的算法如下:
inttx_findmaxvalue(wupwp[],intx[])}
returnmaxvalue;
}
第三章:
测试结果(TestingResults)
1.蛮力法测试结果:
输入完毕后按Enter键有如下结果:
2.动态规划法调试结果
3.贪心法调试结果:
(1).空间最优的贪心策略结果
(2).价格最优的贪心策略结果
(3).价格空间比最优的贪心策略结果
第四章:
分析和讨论
算法的时间复杂度和空间复杂度的分析,对算法进一步改进的讨论。
附录:
源代码(基于C语言的)
1.蛮力法求解01背包问题源程序:
#include""
#include""
#include""
#defineN4
#definemax10
structproduct
{
intid;eightmaxvalue1)
{
maxvalue1=P[i].price;
imax=i;
}
}
eight+P[j].weightmaxvalue2))
{
maxvalue2=P[i].price+P[j].price;
jmaxa=i;
jmaxb=j;
}
}
}
eight+P[j].weight+P[k].weightmax))
{
maxvalue3=P[i].price+P[j].price+P[k].price;
kmaxa=i;
kmaxb=j;
kmaxc=k;
}
}
}
}
eight+P[1].weight+P[2].weight+P[3].weight{
maxvalue4=P[0].price+P[1].price+P[2].price+P[3].price;
printf("%s,%d,%d",P[0].name,P[0].weight,P[0].price);
printf("%d",maxvalue4);ame,P[jmaxa].weight,P[jmaxa].price);
printf("%s,%d,%d\n",P[jmaxb].name,P[jmaxb].weight,P[jmaxb].price);
printf("%d",maxnum);
}
system("pause");
}
voidscannum()d=i+1;
printf("\t物品名称:
");
scanf("%s",&P[i].name);
printf("\t物品重量:
");
scanf("%d",&P[i].weight);
printf("\t物品价格:
");
scanf("%d",&P[i].price);
P[i].flag=0;
printf("\n");
}
}
intmain()入物品的信息\n");
printf("2.求取最佳方案\n");
scanf("%d",&k);
switch(k)
{
case1:
scannum();break;间最优\n");
printf("2.价格最优\n");
printf("3.价格空间比最优\n");
scanf("%d",&Way);
switch(Way)
{
case1:
eight>wp[j+1].weight)
{
temp=wp[j];
wp[j]=wp[j+1];
wp[j+1]=temp;
}
}
break;
case2:
rice>wp[j+1].price)
{
temp=wp[j];
wp[j]=wp[j+1];
wp[j+1]=temp;
}
}
break;
case3:
rice/(float)wp[j].weight<(float)wp[j+1].price/(float)wp[j+1].weight)
{
temp=wp[j];
wp[j]=wp[j+1];
wp[j+1]=temp;
}
}
break;
default:
{
printf("输入错误!
\n");
exit
(1);
}
}
i=0;
RealWeight=wp[0].weight;
TotalPrice=wp[0].price;
printf("被装入背包的物品是:
\n(物品名价格重量)\n");
while(RealWeight{
printf("%s%d%d\n",wp[i].name,wp[i].price,wp[i].weight);
i++;
RealWeight+=wp[i].weight;
TotalPrice+=wp[i].price;
}
RealWeight-=wp[i].weight;
TotalPrice-=wp[i].price;
printf("求解结束!
背包所装物品总重量:
%d,总值:
%d\n",RealWeight,TotalPrice);
printf("退出本次测试请按0!
\n");
scanf("%d",&GoBack);
}while(GoBack!
=0);
returnwp;
}
voidmain()
{
intInputWay,TotalNum,i,TotalWeight,RealWeight,Goon,TotalPrice;
Project*Array;
FILE*fp;
printf("请输入物品数量及背包容量\n");
scanf("%d%d",&TotalNum,&TotalWeight);
if((Array=(Project*)malloc(TotalNum*sizeof(Project)))==NULL)
{
printf("内存已满,申请空间失败!
\n");
exit
(1);
}
else
{
printf("请输入:
物品名价格重量\n");
for(i=0;iscanf("%s%d%d",&Array[i].name,&Array[i].price,&Array[i].weight);
}
Array=Input(Array,TotalNum,TotalWeight);
}
声明
我们在此声明,这个题为“蛮力法、动态查找法、贪心法求解01背包问题”的项目的所有工作是由作为一组的我们的成员的共同的努力而完成的。
尽管程序中存在很多的缺陷,需要完善。
但是这是我们辛苦努力的结果。
人员安排:
程序员:
刘红梅
测试员:
余武丹
报告书写员:
李红波