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


相关推荐

  • vs2010装不了sp1补丁_vs2015没有win32控制台

    vs2010装不了sp1补丁_vs2015没有win32控制台我第一次安装这个补丁的时候就挂了,搞得VS2005和相关的一些程序都不能运行,后来在网上找到了一些解决方法,结合自己的实际体验,写了这篇教程。 补丁相关资料:简体中文版补丁名称:VS80sp1-KB926604-X86-CHS.exe版本:50727.762知识库(KB)文章:KB928957 发布日期:2006/12/14简体中文版补丁大小:430.9

    2022年9月27日
    0
  • RapidXml使用

    RapidXml使用vs2017rapidxml-1.131RapidXml使用1.1创建xml#include<iostream>#include”rapidxml/rapidxml.hpp”#include”rapidxml/rapidxml_utils.hpp”#include”rapidxml/rapidxml_print.hpp”usingnamespacerapidxml;voidcrateXml(){ xml_document<>doc; x

    2022年7月17日
    20
  • 一文搞懂双亲委派模型「建议收藏」

    一文搞懂双亲委派模型「建议收藏」类加载器虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。从Java虚拟机的角度来讲,只存在以下两种不同的类加载器:启动类加载器(BootstrapClassLoader),使用C++实现,是虚拟机自身的一部分所有其它类的加载…

    2022年4月19日
    47
  • tracert的工作原理?_ipconfig工作原理

    tracert的工作原理?_ipconfig工作原理Tracert利用ICMP数据报和IP数据报头部中的TTL值。TTL(TimeToLive)是一个IP数据报的生存时间,当每个IP数据报经过路由器的时候都回把TTL值减去1或者减去在路由器中停留的时间,但是大多数数据报在路由器中停留的时间都小于1秒种,因此实际上就是在TTL值减去了1。这样,TTL值就相当于一个路由器的计数器。当路由器接收到一个TTL为0或者1的IP…

    2022年9月24日
    0
  • JavaScript之爆肝汇总【万字长文❤值得收藏】[通俗易懂]

    JavaScript之爆肝汇总【万字长文❤值得收藏】[通俗易懂]目录一、JavaScript简介1.1.一门客户端脚本语言1.2.JavaScript发展史1.3.JavaScript优势1.4.JavaScript引用一、JavaScript简介1.1.一门客户端脚本语言运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎脚本语言:不需要编译,直接就可以被浏览器解析执行了功能:可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验1.2.JavaScript发展史1992年,Nomba

    2022年6月22日
    21
  • idea远程debug调试_eclipse远程debug

    idea远程debug调试_eclipse远程debug服务器端程序配置第一种方式比如我这次是需要远程debugpresto程序,然后在presto目录下的etc/jvm.config中添加了如下一行命令-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5009扩展:transport:调试时的通讯数据传输方式。address:地址端口server:是否监听调试请求。suspend:是否等待启动,即是否在debuger调试链接建立后才启动debugJVM。第二种

    2022年9月10日
    0

发表回复

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

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