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


相关推荐

  • MySQL error 1396_Last

    MySQL error 1396_LastMySQL主备数据库切换报错1396处理方法,操作步骤如下:mysql>showslavestatus\G;***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:196.55.3.180Mas…

    2022年8月12日
    4
  • js对象转数组_声明一个string类型的数组

    js对象转数组_声明一个string类型的数组 先给个案例体验下 对于像这样的一个对象,把它转换成一个数组,我们在开发中应该会遇到过, {‘未完成’:0,’已完成’:1,’待确认’:2,’已取消’:-1}转为[{"未完成":0},{"已完成":1},{"待确认":2},{"已取消":-1}] 我们首先想到的是把他们一个个循环遍历取出来,push到一个数组当中去letobj1={‘未完成’:0,’已完…

    2025年11月10日
    3
  • 如何搭建www服务器_网站服务器

    如何搭建www服务器_网站服务器更多内容参见个人技术博客,无广告欢迎关注搭建自己的服务器,过程大致分为3步:*购买服务器,配置系统环境*获得域名* CA认证1、购买服务器,配置系统环境经过比较,阿里云、腾讯

    2022年8月4日
    10
  • pytest fixtures_today fixture

    pytest fixtures_today fixturefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年8月6日
    5
  • Vuex的使用(五)——mapGetters的定义和用法[通俗易懂]

    Vuex的使用(五)——mapGetters的定义和用法[通俗易懂]参考文档:https://vuex.vuejs.org/zh/guide/当需要在组件中使用多个getters时,可以利用mapGetters批量生成计算属性(新增文件路径为src\components\componentE.vue),代码如下:mapGetters用法gettersinvuex:{{param2}}引用上面创建的component-e查看效果(修改文件路径为src\main.js),代码如下:imp

    2022年5月22日
    59
  • nginx转发mysql连接

    nginx转发mysql连接场景:访问UAT环境,只能使用客户电脑访问,太难用了,于是就需要在自己电脑上跑代码,通过客户电脑中转来访问uat环境的数据库。选用nginx进行转发。配置如下:stream{upstreamcloudsocket{hash$remote_addrconsistent;server192.168.182.155:3306weight=5max_fails=3fail_timeout=30s;}server{

    2022年10月19日
    4

发表回复

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

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