您的位置:首页 > 其它

【算法】回溯法实现0-1背包【原创技术】

2012-05-17 10:25 316 查看
实验要求
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;

};

更多详细内容::::去学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: