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

来源:互联网 发布:香港移动网络制式 编辑:程序博客网 时间:2024/06/01 10:04

实验要求

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;
};

更多详细内容::::去学习

原创粉丝点击