回 溯 法

一、(what?)

二、(why?)

三、(how?)

四、典型例题分析:

例题1:大卖场购物车2——0-1背包问题

问题分析:

算法设计:

图解算法:

 

 

 

 

 

 

 

 

 

 

伪代码:

double Bound(int i)//计算上界(即已装入物品价值+剩余物品的总价值)
{int rp=0; //剩余物品为第i~n种物品while(i<=n)//依次计算剩余物品的价值{rp+=v[i];i++;}return cp+rp;//返回上界
}

 

void Backtrack(int t)     //t表示当前扩展结点在第t层
{if(t>n)              //已经到达叶子结点{for(j=1;j<=n;j++){bestx[j]=x[j];}bestp=cp;       //保存当前最优解return ;}if(cw+w[t]<=W)       //如果满足约束条件则搜索左子树{x[t]=1;cw+=w[t];cp+=v[t];Backtrack(t+1);cw-=w[t];cp-=v[t];}if(Bound(t+1)>bestp) //如果满足限界条件则搜索右子树{x[t]=0;Backtrack(t+1);}
}

 完整代码:
 

#include<iostream>
#include<string>
#include<algorithm>
#define M 105 
using namespace std;int i,j,n,W; //n表示n个物品,W表示购物车的容量
double w[M],v[M];//w[i] 表示第i个物品的重量,v[i] 表示第i个物品的价值
bool x[M]; //x[i]表示第i个物品是否放入购物车
double cw; //当前重量
double cp;//当前价值
double bestp;//当前最优价值
bool bestx[M]; //当前最优解double Bound(int i)//计算上界(即已装入物品价值,剩余物品的总价值) 
{int rp=0;//剩余物品为第i~n种物品 while(i<=n)//一次计算剩余物品的价值 {rp+=v[i];i++;}return cp+rp;//返回上界 
}void Backtrack(int t)//t表示当前扩展点在第t层 
{if(t>n)//已经到达叶子结点{for(j=1;j<=n;j++){bestx[j]=x[j];}bestp=cp;//保存当前最优解return ; } if(cw+w[i]<=W)//如果满足条件约束搜索左子树 {x[t]=1;cw+=w[t];cp+=v[t];Backtrack(t+1);cw-=w[t];cp-=v[t];}if(Bound(t+1)>bestp)//如果满足限界条件搜索右子树 {x[t]=0;Backtrack(t+1);}
}void Knapsack(double W,int n)
{//初始化cw=0;cp=0;bestp=0;double sumw=0.0;double sumv=0.0;for(i=1;i<=n;i++){sumv+=v[i];sumw+=w[i];}if(sumw<=W){bestp=sumv;cout<<"放入购物车的物品最大价值为:"<<bestp<<endl;cout<<"所有的物品均放入购物车。";return;}Backtrack(1);cout<<"放入购物车的物品最大价值为:"<<bestp<<endl;cout<<"放入购物车的物品序号为:";for(i=1;i<=n;i++) //输出最优解{if(bestx[i]==1)cout<<i<<" ";}cout<<endl;
}int main()
{cout << "请输入物品的个数n:";cin >> n;cout << "请输入购物车的容量W:";cin >> W;cout << "请依次输入每个物品的重量w和价值v,用空格分开:";for(i=1;i<=n;i++)cin>>w[i]>>v[i];Knapsack(W,n);return 0;
} 

例题2:

例题3:

例题4:

例题5:

例题6:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/190247.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

for,while,do-while,死循环,嵌套循环,跳转关键字,随机数

1.for循环 public class ForDemo1 {public static void main(String[] args) {for (int i 0; i < 5; i) {System.out.println("HelloWorld");}System.out.println("--------------------------------------------");for (int i 1; i <10 ; i) {Sy…

反激变压器计算方法_笔记

反激变压器计算方法_笔记 匝数比原边电感选定磁芯线圈匝数线径 原视频链接 匝数比 5V 是想要得到的输出电压 0.7V为二极管导通的压降 185Vx根号2是有效值 最大占空比取0.4。得出最小匝数为30。 更改某些值可能得出来的匝数比就不一定是30了&#xff0c; 这其实也是反激变压器…

PS学习笔记——新建文档/修改文档

文章目录 新建文档文档属性像素/分辨率颜色模式背景内容高级选项存储预设 修改文档 新建文档 方法一&#xff1a;ctrlN快捷键可直接打开新建文档界面 方法二&#xff1a;点击菜单栏中 文件->新建&#xff0c;即可打开新建文档界面 文档参数可按需调节(标题可以提前设定或者…

分布式服务与分布式框架

分布式副武其实就是根据某个粒度&#xff0c;将服务拆分&#xff0c;而分布式框架就是将这些服务协调&#xff0c;管理起来。分布式框架&#xff0c;我认为服务调用是他的基础能力&#xff0c;该能力是所有分布式框架的基础能力&#xff0c;其次是服务注册与发现。 在这个维度…

Mac M1 M1 pro安装 protobuf 2.5.0

因为项目中的protobuf是2.5.0版本&#xff0c;但是旧版本的protobuf 不支持M1&#xff0c;此时需要修改源码重新编译 操作步骤&#xff1a; 从git上面下载对应版本的protobuf&#xff0c;地址&#xff1a;Release Protocol Buffers v2.5.0 protocolbuffers/protobuf GitHub…

Leetcode 【2342. 数位和相等数对的最大和】

给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j &#xff0c;找出并返回 nums[i] nums[j]…

【Linux】进程间是这样通信的--管道篇

TOC 目录 进程间通信的介绍 进程间通信的概念 进程间通信的目的 进程间通信的本质 进程间通信的分类 管道 什么是管道 匿名管道 pipe函数 匿名管道使用步骤 管道读写规则 管道的特点 1、管道内部自带同步与互斥机制 2、管道的生命周期随进程 3、管道提供的是流式…

DevSeo Studio设置中文界面

安装好DevSeo Studio后默认打开是欢迎页。 左下角Configure点击展开&#xff0c;选择plugins 弹出页面选择“installed”,然后输入chinese,默认是关闭的&#xff0c;点击enable将它启用&#xff0c;然后点击OK。 弹出页面点击“restart”重启即可。

face_recognition:高准确率、简单易用的人脸识别库 | 开源日报 No.79

ageitgey/face_recognition Stars: 49.8k License: MIT 这个项目是一个使用 Python 编写的人脸识别库&#xff0c;可以从图片中识别和操作人脸。它基于 dlib 开发&#xff0c;并采用深度学习技术构建了最先进的人脸识别模型&#xff0c;在 Labeled Faces in the Wild 数据集上…

搭建企业社区,如何激发员工互动?

本文是关于企业内部社区搭建后怎么运营&#xff0c;如何激发员工互动。 作为运营者&#xff0c;我们搭建企业内部员工的目的首先得明确下来&#xff0c;一般都是打造和宣扬企业内部文化&#xff0c;发布公司政策通知和行业动态、组织公司关键节点活动、以及员工经验分享资源分…

java智慧校园信息管理系统源码带微信小程序

一、智慧校园的定义 智慧校园指的是以云计算和物联网为基础的智慧化的校园工作、学习和生活一体化环境。以各种应用服务系统为载体&#xff0c;将教学、科研、管理和校园生活进行充分融合&#xff0c;让校园实现无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、…

订阅号和服务号有什么区别

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;我们都知道&#xff0c;服务号一个月只能发4次文章&#xff0c;但是订阅号每天都能发文章。不过在接收消息这一方面&#xff0c;服务号群发的消息有消息提醒&#xff0c;并显示在对话框&#xff1b…