【算法】回溯法实现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;
};
更多详细内容::::去学习
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;
};
更多详细内容::::去学习
相关文章推荐
- 【算法】分支限界法实现0-1背包问题【原创技术】
- 【算法】最大堆实现排序(从大到小输出)【原创技术】
- 算法java实现--回溯法--0-1背包问题
- 关于AI算法芯片实现的几点看法(原创)
- 背包问题 算法实现
- 基于MEL算法的音频ID比对技术的研究与实现[00原创]
- 【原创】fast wcsnicmp 算法实现
- [原创] WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]
- 算法学习之基础(背包 列队 栈) 习题1.3.34随机背包的实现
- 基于Spark的移动用户主要活动地点的挖掘算法实现以及JavaEE技术整合
- 回溯法实现0-1背包
- 0-1 背包算法实现[java版有瑕疵,你可以看看]
- 用贪心算法背包问题,Java实现
- 原创: 仿Baidu,Google查询分页技术实现分析之一
- 背包问题之贪心算法实现
- RSA加解密及签名算法的技术原理及其Go语言实现
- 搜索引擎对网页去重技术算法- 用来解析伪原创与网页相似度
- 背包问题 01背包详解及其实现 空间压缩技术 对应于背包九讲之一
- 排序技术_各种算法原理 图解 代码实现
- 即时战略游戏中寻径(Path-finding)算法的原理及实现技术