1、河北工业大学计算机科学与软件学院算法分析与设计实验报告实验: 0/1 背包问题姓名:学号:班级:“0-1“背包问题的动态规划算法一、 实验目的与要求:熟悉 C/C+语言的集成开发环境;通过本实验加深对贪心算法、动态规划和回溯算法的理解。二、 实验内容:掌握贪心算法、动态规划和回溯算法的概念和基本思想,分析并掌握“0-1“背包问题的三种算法,并分析其优缺点。三、 实验程序:#include“stdio.h“int n=5;int w=0,3,2,1,4,5;int v=0,25,20,15,40,50;int x5;int V67;int C=6;void main(void)int i,j;f
2、or(i=0;iVi-1j-wi+vi)Vij=Vi-1j;elseVij=Vi-1j-wi+vi;/以上构造动态规划表j=C;for(i=n;i0;i-)if(VijVi-1j)xi=1;j=j-wi;else xi=0;printf(“动态规划表如下:n“);for(i=0;i/定义 min、max 函数int min(int a,int b)if(a=b) return b;else return a;int max(int a,int b)if(a=b) return a;else return b;void Knapsack(int v6,int w6,int c,int n,int
3、 m66)/int jmax=min(wn-1,c);for(int j=0;j1;i-)jmax=min(wi-1,c);for(int j=0;j=w1)m1c=max(m1c,m2c-w1+v1);void Traceback(int m66,int w6,int c,int n,int x6)for(int i=1;ic1;cout“0-1 背包如下:“endl;cout“物品的重量分别为:“endl;for(int p=1;p6;p+)coutw1p“ “;coutendl;cout“物品的价值分别为:“endl;for(int q=1;q6;q+)coutv1q“ “;couten
4、dl;cout“背包的容量为:“c1endl;cout“要选择的物品是:“endl;Knapsack(v1,w1,c1,n1,t);/for(int i=1;i=n1;i+)coutv1iendl;Traceback(t,w1,c1,n1,x1);for(i=1;i=n1;i+)if(x1i=1)m+=v1i;cout“第“i“件物品“endl;cout“最大总价值为:“mendl;四、 实验结果:五、 实验分析:本次实验用回溯法解决 0/1 背包问题,回溯法首先要建立 0/1 背包的解空间树,然后再回溯得出搜素空间,即解的范围,然后求出最佳答案。实验中先构造两个函数,Knapsack 列出所有背包的解空间,Traceback 对解空间进行搜索,得出答案。