实验要求
1. 理解回溯法算法的深度优先搜寻原理及一般应用。
2. 理解回溯法的解向量、解空间、子集树、排列树原理及基本应用。
3. 编程实现典型回溯算法,理解回溯思想,并对算法进行验证分析。
实验内容
回溯法0-1揹包问题
示例输入(规定物品数量为10,揹包容量为50,输入为20个数,前十个为物品重量,后十个数为物品价值):
12
3
11
5
6
8
9
4
7
10
6
2
7
3
2
9
8
10
4
5
示例输出(最大价值):
44
源代码:
//科目:算法实验5
//题目:回溯法0-1揹包问题
//作者:武叶
//语言:C语言
//创作时间:2012年4月17日
#include<iostream>
using namespace std;
int N=10; //定义物品数量为10
double C=50; //定义揹包容量50
double weight[100],price[100]; //定义物品重量weight和物品价值price
double now_weight=0,now_price=0; //定义当前物品重量now_weight,当前物品价值now_price
double best_price=0; //当前最优值best_price
double pack(int i);
double into_bag (double pp[],double ww[],double d);
void back_search(int i);
int main()
{
int i,j;
double temp,a_temp,x_price[100];
for(i=1;i<=N;i++)
cin>>weight[i]; //输入10个物品的重量
for(i=1;i<=N;i++)
cin>>price[i]; //输入10个物品的价值
for(i=1;i<=N;i++) //开始进行排序
x_price[i]=price[i]/weight[i];
for(i=1;i<=N;i++)
for(j=i+1;j<=N;j++)
if(x_price[i]<x_price[j])
{
temp=x_price[i];
x_price[i]=x_price[j];
x_price[j]=temp;
a_temp=price[i]; //交换价格
price[i]=price[j];
price[j]=a_temp;
a_temp=weight[i]; //交换重量
weight[i]=weight[j];
weight[j]=a_temp;
}
into_bag(price,weight,C); //调用装入函数into_bag装入物品
cout<<best_price<<endl;
return 0;
}
double pack(int i)
{
double left_c,b;
left_c=C-now_weight; //剩余揹包容量
b=now_price;
while(i<=N && weight[i]<=left_c) //物品重量价值递减装入物品
{
left_c-=weight[i];
b+=price[i];
i++;
}
if(i<=N)
b+=price[i]*left_c/weight[i];
return b;
}
void back_search(int i)
{
if(i>N)
{
if(now_price>best_price)
best_price=now_price;
return;
}
if(now_weight+weight[i]<=C)
{
now_weight+=weight[i];
now_price+=price[i];
back_search(i+1);
now_price-=price[i];
now_weight-=weight[i];
}
if(pack(i+1)>best_price)
back_search(i+1);
}
double into_bag (double p_price[],double p_weight[],double d)
{
int i;
double t_price=0,t_weight=0;
now_weight=0.0;now_price=0.0;best_price=0.0;//计算所有物品的重量及价值
for(i=1;i<=N;i++)
{
t_price=t_price+p_price[i];
t_weight=t_weight+p_weight[i];
}
if(t_weight<=d) //所有物品装入揹包
best_price=t_price;
else
{
back_search(1);
}
return best_price;
};
更多详细内容::::去学习