- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
蛮力法、动归、贪心、分支限界法解01背包问题剖析
算法综合实验报告
学 号: 1004121206 姓 名: 林
一、实验内容:
分别用蛮力、动态规划、贪心及分支限界法实现对0-1背包问题的求解,并至少用两个测试用例对所完成的代码进行正确性及效率关系上的验证。
二、程序设计的基本思想、原理和算法描述:
蛮力法
1.1数据结构
注:结构体obj用来存放单个物品的价值和重量
typedef struct obj
{
int w;//物品的重量
int v;//物品的价值
};
1.2 函数组成
void subset(int s[][10],int n):用来生成子集的函数
void judge(int s[][10], obj obj[],int mark[],int n,int c):判断子集的可行性
int getmax(int mark[],int n,int flag):求解问题的最优解
void outputObj(int flag,int s[][10],int n):输出选择物品的情况
1.3 输入/输出设计
本程序通过键盘进行输入、屏幕进行输出。
1.4 符号名说明
符号 说明 S[][] 存放子集 mark[] 记录子集的可行性 n 物品的个数 c 物品的容量 max 记录背包所能产生的最大价值 flag 记录能产生最大价值的子集的编号
1.5 算法描述
算法的伪代码描述如下:
输入:背包的容量c,物品的个数n,n个物品的重量 w[n],价值v[n]
输出:装入背包的物品编号以及产生的最大价值
1.初始化最大价值 max=0,结果子集 s=φ;
2.对集合{1,2,......n}的每一个子集T,执行下述操作:
2.1初始化背包的价值 v=0,背包的重量 w=0;
2.2对子集t的每一个元素j
2.2.1 如果w+wjc,则 w=w+wj,v=v+vj;
2.2.2 否则,转步骤2考察下一个子集;
2.3如果maxv,则 max=v;s=t;
3.输出子集S中的各元素
动态规划法
2.1 数据结构
该程序不涉及任何数据结构
2.2 函数组成
int max(int i,int j);比较并返回两个数中的较大值
int KnapSack (int w[],int v[],int x[],int n,int c);求解背包取得的最大值
2.3 输入/输出设计
本程序通过键盘进行输入、屏幕进行输出。
2.4 符号名说明
符号 说明 n 物品的个数 c 物品的容量 w[] 物品的重量 v[] 物品的价值 x[] 物品的选择情况 V[][] 存放迭代结果
2.5 算法描述
算法的伪代码描述如下:
输入:背包的容量c,物品的个数n,n个物品的重量 w[n],价值v[n]
输出:装入背包的物品标号和背包获得的最大价值
1.初始化二维数组V[][]={0}
2.初始化二维数组的第0行,第0列
2.循环直到i==n
2.1 循环直到j=c
2.1.1 如果背包的容量不足以装入物品i,则装入前i个物品得到的最大价值和装入前i-1个物品得到的最大价值相等
2.2.2 如果背包的容量可以装入物品i,分别计算装入物品i可达到的价值量V[i-1][j-w[i]]+v[i],以及不放入物品i可以得到的最大价值V[i-1][j],取二者中的较大者作为把前i个物品装入容量为j的背包中的最优解
贪心法
3.1数据结构
注:结构体用来存放物品的重量、
文档评论(0)