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;
}
*/

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 最新服务器节点,服务器emule必备知识(更新服务器列表与kad节点文件)

    最新服务器节点,服务器emule必备知识(更新服务器列表与kad节点文件)emule必备知识(更新服务器列表与kad节点文件)emule必备知识emule是通过ED2K网络和KAD网络寻找、连接其他emule客户端的所以服务器列表和KAD节点文件是emule的必需文件。有些新手由于下载官方原版emule压缩包或其他未集成这些必需文件的emule压缩包从而出现“连接不上ED2K与KAD”问题。所以学会下载更新服务器列表与KAD节点文件是使用emule的第一步以下方法…

  • switch中的continue和break区别[通俗易懂]

    switch中的continue和break区别[通俗易懂]今天c程设期末考试,突然有一道选择题是关于switch中的break和continue问题。若switch外部没有循环,则break和continue没有区别。若switch外部还有循环,{一.若break,continue在switch外部,则二者作用的是外部循环。二.若break,continue在switch内部,则break作用于switch,continue作用于外部循环。…

  • unity c++ c#(3d加工编程软件)

    一、前言这篇文章主要是给零基础想要Unity入门的关于C#编程的一些意见二、参考文章unity中的C#编程-零基础(Unity2017)三、正文1.什么是C#编程语言?微软官方出版2.编程工具(IDE)3.创建第一个C#代码4.场景的保存和脚本的保存5.关于日志输出(指控制输出,其中Log有三类:正常、警告、错误输出)6.变量7.方法的定义和调…

  • Laravel 出现 No application encryption key has been specified.

    Laravel 出现 No application encryption key has been specified.

    2021年10月20日
  • linux go环境搭建_golang后端框架

    linux go环境搭建_golang后端框架1.下载go语言包,go1.9.2.linux-amd64.tar.gzhttps://www.golangtc.com/download2.解压安装[root@localhostlocal]#pwd/usr/local[root@localhostlocal]#tar-xzvfgo1.9.2.linux-amd64.tar.gz [root@localhostlocal]#c…

    2022年10月10日
  • JAVA中SQL查询语句大全,select多表查询,各种查询

    JAVA中SQL查询语句大全,select多表查询,各种查询以员工表:emp为例idnamegenderbirthdaydeptjobsalbonus编号姓名性别生日部门职位薪资奖金基本查询–查询emp表中的所有员工信息select*fromemp;–查询emp表中的所有员工的姓名、薪资、奖金selectname,sal,bonusfromemp;–查询emp表中…

发表回复

您的电子邮箱地址不会被公开。

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