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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RabbitMQ入门:在Spring Boot 应用中整合RabbitMQ

    在上一篇随笔中我们认识并安装了RabbitMQ,接下来我们来看下怎么在SpringBoot应用中整合RabbitMQ。先给出最终目录结构:搭建步骤如下:切换到amqp应用的控制台,能看到打印

    2022年2月16日
  • 如何实现微信上制作活动链接「建议收藏」

    如何实现微信上制作活动链接「建议收藏」随着互联网的快速发展,无论是房产、装修检查、家居、家店还是商城、餐饮等行业,商家们都会用到活动预约报名,线上活动链接的制作不仅成本低,而且受众也广,可以达到快速宣传的效果。相信很多小伙伴们在微信朋友圈看到的微信活动报名链接很好奇,这种活动链接是如何实现的,希望自己也可以在微信上制作这种活动链接。    工预善其事必先利其器,在这里,咱不能不提到一个非常好用的微信活动制作神器—获客宝。这款软件的神奇之处在于,他不仅可以帮你在微信上制作活动页面,而且还可以帮你侦查到谁偷偷浏览了你的页面(悄悄来,又悄悄走,不

    2022年9月18日
  • 简单鼠标跟随代码[通俗易懂]

    简单鼠标跟随代码[通俗易懂]效果图:htmlcode:csscode:jscode

    2022年7月2日
  • vmware15激活码【永久激活】「建议收藏」

    (vmware15激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlbnNlSWQiOi…

    2022年3月21日
  • 【零基础】MT4量化入门一:跑一个简单的boll

    【零基础】MT4量化入门一:跑一个简单的boll一、前言  今天开始研究MT4了,MT4是大大有名的外汇交易和量化软件,使用一种叫做MQL的语言来开发量化程序(跟C比较像)。因为是外国人做的,用的也大部分是外国人,使用起来不是很顺手,跟极星各有优劣吧。这里我就先逐步讲一下MT4的使用,然后再简单跑一个boll指标,最后汇总下使用心得。二、安装  1、下载MT4  不熟悉这东西,连安装都是个麻烦事儿。MT4官网好找一搜就有,下载链…

    2022年5月23日
  • win10系统下pycharm2017配置opencv-python3.4.5[通俗易懂]

    win10系统下pycharm2017配置opencv-python3.4.5[通俗易懂]1.首先打开Pycharm,点击文件-设置-项目-projectinterpreter,查看python版本,我的显示是3.6.8,如下图:2.打开opencv-python官网,下载对应版本的opencv-python,如下图:3.点击win+R,输入cmd,即打开了命令窗口,由于我给pycharm配置的解释器是用anaconda装的,所以我需要把opencv-python安装…

    2022年8月26日

发表回复

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

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