0-1背包问题的多种算法设计与分析
0-1背包问题描述:给定一组共n个物品,每种物品都有自己的重量wi(i=1~n)和价值vi(i=1~n),在限定的总重量(背包的容量C)内,如何选择才能使得选择物品的总价值之和最高。选择最优的物品子集放置于给定背包中,最优子集对应n元解向量(x1,…xn), xi∈{0或1},因此命名为0-1背包问题。
输入:为方便这种大规模输入数据的调试,采用文件输入,标准输出(文件输出当然也可)的形式。数据输入的格式如下:每组测试数据包含n+1行,第1行为C和n,表示背包容量为C且有n个物品,接下来n行是这n个物品的重量wi和价值vi。背包容量和物品重量都为整数。
输出:输出n+1行。第1行为所选物品的最大价值之和,接下来n行为装入背包的物品所对应的n元最优解向量(x1,…xn), xi∈{0或1},但每行以"i xi"形式输出。
任务:选用三种算法解决问题。
2. 多种算法详细设计
1) 递归
伪代码:
//递归函数
f(int i)
{
if(i >= n){ if(cp > best) best = cp; }
if(c - cw > w[i]){ cw += w[i];cp += v[i];f(i+1); cw -= w[i];cp -= v[i];f(i+1); }
else f(i+1);
}
//主函数
main()
{
//调用freopen函数,采用文件输入
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf( 背包最大重量与物品个数 );
for(i=0;i<n;i++) scanf("%d%d",&w[i],&v[i]); //从文件中逐个读取数值
start = clock(); //调用clock函数计算算法开始时间
f(0); //递归入口
printf( 最大物品价值 );
printf( 物品存放状态 );
finish = clock(); //调用clock函数计算算法结束时间
printf( 算法使用时间 );
}
数据类型的定义:
#define SIZE 整数
clock_t start, finish; //算法开始与结束的时间变量
int cw=0, cp=0; //cw是递归到当前的物品重量,cp是递归到当前的物品价 值
int s; //获得的最大价值
int w[SIZE]; //每个物品的重量
int v[SIZE]; //每个物品的价值
int x[SIZE]; //物品存放状态
int n; //物品个数
int C; //背包最大容量
主程序与模块之间的层次(调用)关系:
main() 先调用 f(),f() 再递归调用自身,返回最大价值,保存最优解
算法简略分析:
对于背包容量为c ,n