0-1背包问题回溯法C++代码

0-1背包问题回溯法C++代码 /*给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?*/#includeusingnamespacestd;#defineMAXSIZE100#defineTRUE1#defineFALSE0#defineERROR-1typedeffloatvalu

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 

/*给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。
问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
*/
#include <iostream>
using namespace std;

#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define ERROR -1
typedef float value;
typedef float weight;
typedef int KeyType; // 定义关键字类型为整数类型

typedef struct //元素定义
{

weight w;//重量
value v;//价值
value q;//单位重量价值
int index;//序号
bool job;//表示是否被用
}Bag;

typedef struct //定义背包集
{

Bag r[MAXSIZE+1];//r[0]闲置或用作 “ 哨兵单元”
int length; //背包个数
}Bags;

int n;//包个数
int i;//辅助整型变量
weight c;//背包的容量
weight cw;//当前重量
value bestp=0;//当前最优价值
value cp;//当前价值
Bags L;//定义背包集

int Partition(Bags &L,int low,int high) //快速排序
// 交换顺序表L中子表r[low…..high]的记录,枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大于它.
{

int shuzhou; //定义枢轴
L.r[0]=L.r[low]; //用第一个记录作为枢轴记录
shuzhou=L.r[low].q;
while(low<high)
{

while(low<high && L.r[high].q>=shuzhou)
–high;
L.r[low]=L.r[high];
while(low<high && L.r[low].q<=shuzhou)
++low;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}//Partition

void QuickSort(Bags &L,int low,int high) //快速排序
//对顺序表L[low ….high]作快速排序
{

int shuzhou;
if(low<high)
{

shuzhou=Partition(L,low,high); // 获得枢轴
QuickSort(L,low,(shuzhou-1)); //对枢轴前半部分排序
QuickSort(L,(shuzhou+1),high); //对枢轴后半部分排序
}
}//QuickSort

value bound(int i)
{//计算上界
weight left=c-cw;//剩余容量
value bound=cp;
//以物品单位重量价值递减顺序装入物品
while(i<=n&&L.r[i].w<=left)
{

left-=L.r[i].w;
bound+=L.r[i].v;
i++;
}
//装满背包
if(i<=n)
bound+=L.r[i].v*left/L.r[i].w;
return bound;
}//bound

void backtrack(int i)
{

if(i>n)
{//到达叶子结点
bestp=cp;
return ;
}
//搜索子树
if(cw+L.r[i].w<=c)
{//进入左子树
cw+=L.r[i].w;
cp+=L.r[i].v;
//L.r[i].job=true;//选中
backtrack(i+1);
cw-=L.r[i].w;
cp-=L.r[i].v;
//L.r[i].job=false;//未选中
}
if(bound(i+1)>bestp)//进入右子树
backtrack(i+1);
}//backtrack

void knapsack(weight c)//0-1背包问题主算法
{

QuickSort(L,1,L.length);
backtrack(1);//回溯搜索
}//knapsack

int main()
{

//输入要选择的背包信息
cout<<“请输入背包的容量:”;
cin>>c;
cout<<“请输入物品个数(注意:不能超过 100个!):”;
cin>>n;
if(n>100)
{

cout<<“你输入的物品个数太多!!!”<<endl;
return FALSE;
}
L.length=n;

for(i=1;i<=n;i++)
{

cout<<“请输入第个”<<i<<“物品的重量:”;
cin>>L.r[i].w;
cout<<“请输入第个”<<i<<“物品的价值:”;
cin>>L.r[i].v;
L.r[i].q=L.r[i].v/L.r[i].w;//单位重量价值
L.r[i].index=i;//索引号
cout<<endl;
}
//执行0-1背包问题主算法
knapsack(c);
//输出结果
for(i=1;i<=n;i++)
if(L.r[i].job)
cout<<“第个”<<L.r[i].index<<“物品被选中”<<endl;
cout<<“被选中的物品的总价值为: “<<bestp<<endl;;
return TRUE;
}

/*
template<class Typew, class Typep>
Typep Knap<Typew, Typep>::Bound(int i)
{// 计算上界
Typew cleft = c – cw; // 剩余容量
Typep b = cp;
// 以物品单位重量价值递减序装入物品
while (i <= n && w[i] <= cleft) {

cleft -= w[i];
b += p[i];
i++;
}
// 装满背包
if (i <= n) b += p[i]/w[i] * cleft;
return b;
}
*/

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180021.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电子琴入门教程视频电子琴简谱

    电子琴入门教程视频电子琴简谱电子琴入门教程视频电子琴简谱9套少儿电子琴教程1,儿童电子琴启蒙(上下集)2,儿童专用-简谱五线谱视频教程3,电子琴启蒙视频教程4,儿童电子琴启蒙-全套教程5,少儿电子琴教程6,少儿电子琴入门7,少年儿童电子琴初级、中级、高级教程8,经典儿童歌曲歌谱大全9,儿童电子琴启蒙文档网盘链接:链接:https://pan.baidu.com/s/1PpguBcJOeS82SzELRyG9PA提取码:love领到了给个赞鼓励下哦~…

    2022年8月29日
    3
  • 思科配置VLAN的实例

    思科配置VLAN的实例在我们上面的环境,是一个传统的网络,所有的主机都在一个广播域地址,正是这个原因,使得网络当中的广播包,给整个网络带来巨大的压力。总之,在这种情况下,同一个vlan的主机可以通信,不同一个vlan的主机不可以通信。pc2和pc4同属vlan20,(同一个vlan的主机可以通信)VLAN就是虚拟局域网的意思,它的特点是灵活性高,可扩展性高。好了,我们有关于思科配置VLAN的实例就到这里了,谢谢大家。在sw1上将相应的接口加入到相应的vlan,(在sw2上将相应的接口加入到相应的vlan,(…

    2022年9月19日
    0
  • Effective C++ 条款11

    Effective C++ 条款11

    2022年1月28日
    57
  • 1.2.太极平台框架简介

    1.2.太极平台框架简介1、太极平台框架简介太极平台框架,是专为制作管理后台系统而开发的一个框架。使用该框架,可以非常快速的搭建后台管理系统。针对于列表、以及增删改查这种通用的功能,太极框架只需要配置列表有哪些字段,以及这些字段的一些属性,就能创建出一个增删改查的功能。不需要编写任何代码即可完成。列表功能可设置字段的各种显示效果,自动格式化各种类型的字段数据。比如只需要设置字段为搜索项,就自动拥有搜索功能。添…

    2022年6月4日
    60
  • Tabnine 激活码破解方法【注册码】

    Tabnine 激活码破解方法【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    35
  • BigDecimal 类型比较大小

    BigDecimal 类型比较大小1.标准做法Longzero=0l;BigDecimalbig_decimal_num=newBigDecimal(zero);intr=big_decimal_num.compareTo(BigDecimal.ZERO);//和0,Zero比较if(r==0)//等于…

    2022年7月14日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号