【算法】回溯法实现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;
};
更多详细内容::::去学习
- 【算法】回溯法实现0-1背包【原创技术】
- 【算法】分支限界法实现0-1背包问题【原创技术】
- 算法java实现--回溯法--0-1背包问题
- 回溯法实现0-1背包
- 经典算法9:回溯法之0--1背包问题
- 回溯算法之0-1背包问题
- 0-1背包问题:(回溯算法)
- 0-1背包问题:(回溯算法)
- 0-1背包问题(回溯算法)
- 0-1背包 回溯法
- 【回溯法】0-1背包
- Java实现回溯法解决0-1背包问题
- 回溯法之0-1背包问题(C实现)
- 0—1背包问题,回溯实现
- 01背包问题(回溯算法实现)
- 01背包问题(回溯算法实现)
- 回溯算法_01背包问题_Java实现
- 贪心法和回溯法 求解“背包、0/1背包问题”——Java 实现
- WordPress备份方法
- 将ComboBox 控件绑定到数据
- 数组和指针小结
- serverlet学习
- DHCP协议和dhcpcd源码分析
- 【算法】回溯法实现0-1背包【原创技术】
- PHP 类中定义常量,并对常量的使用方法(转帖)
- 不同类型变量赋值的讨论
- ulipad找不到python解释器
- C++成员函数,非成员函数,友元函数,隐式类类型转换
- SQL 方面专家
- NYOJ 540 奇怪的排序(字符串)
- Ubuntu下以USB调试方式链接Android手机
- sqlserver 连接字符串