0-1背包回溯法求解

回溯法 —— 求解0/1背包问题(剪枝) 0/1背包问题 题目描述: 有n个重量分别为w1,w2,…,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,…,vn,给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么选不中,要求选中的物品不仅能够放到背包中,而且具有最大价值,并对下表所示4个物品求出W=6时的所有解和最佳解。 分析思路:回溯法 设n件物品重量分别为w1,w2,…,wn的物品,用数组w[1 … n]存放,物品的价值分别为v1,v2,…,vn,用数组v[n]存放;限制重量用W表示。用x[ 阅读详情

问题描述

在这里插入图片描述

思路

回溯法求解,解空间是一棵子集树。
算法的时间复杂度为O(2n)

代码

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int bestv=0;//存放最优值
int cv=0;//当前背包的价值量
int cw=0;//当前背包的重量
int v[101];//存放物品价值量数组
int w[101];//存放物品重量数组
int x[101];//存放当前解
int bestx[101];//存放最优解
//回溯法 解空间是一个二叉树 递归回溯
void getbestv(int i,int n,int c)
{
    if(i>n){//递归出口,到了叶子节点以后了
        //如果当前背包价值量cv大于最优值bestv,更新最优值,最优解
        if(cv>bestv){
            bestv=cv;
            for(int k=1;k<=n;k++)//更新最优解
                bestx[k]=x[k];
        }
        return ;//递归出口
    }
    //子集树,j=0或者j=1两种条件求解
    for(int j=0;j<=1;j++){
        x[i]=j;//x[i]=0,x[i]=1两种情况都遍历
        if(cw+w[i]<=c){
            //更新当前背包重量,当前背包价值
            cw=cw+x[i]*w[i];
            cv=cv+x[i]*v[i];
            //子集树向下寻找
            getbestv(i+1,n,c);
            //还原背包重量,背包价值
            cw=cw-x[i]*w[i];
            cv=cv-x[i]*v[i];
        }
    }
    return ;
}
int main()
{
    int c;//表示背包的容量
    cin>>c;
    int n;//表示有n个物品
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>w[i];
    for(int i=1;i<=n;i++)
        cin>>v[i];
    getbestv(1,n,c);
    cout<<bestv;//输出最优值
    
}
用回溯法求解0-1背包问题 回溯函数 参数t表示当前处在第几层做抉择,t=1时表示当前在决定是否将第一个物品放入背包。//遍历当前节点的子节点:0 不放入背包,1放入背包。//遍历当前节点的子节点:0 不放入背包,1放入背包。//x[i]=1:物品i放入背包,0代表不放入。//n:一共有多少物品,c:背包的最大容量。//约束条件:当前物品是否放的下。//约束条件:当前物品是否放的下。//当前放入背包的物品总重量。//当前放入背包的物品总价值。//如果找到了一个更优的解。//如果找到了一个更优的解。//叶子节点,输出结果。 阅读详情

相关推荐

用回溯法求解0/1背包问题

输出如下: 背包所盛放物品的最大价值为: 60 所盛放物品编号为 [1, 2] 代码如下: package AlgorithmTest; import java.util.ArrayList; import java.util.Collections; /** * Created by dell on 2016/12 *用回溯法求解01背包问题,回溯法可以求解最

李意文的博客 4937

回溯法求解01背包问题

问题描述在前面文章http://blog.youkuaiyun.com/zjq_1314520/article/details/74858504我们使用动态规划求解了背包问题,时间复杂度是O(cn)O(cn),当我们的c的值非常大的时候,说消耗的时间也是非常大的! 接下来我们就使用回溯法来求解这个问题,其时间复杂度为O(n2n)O(n2^n),这个结果当我们的c的值是小于2n2^n的时候,该算法所需的时间是小

未思 1万+

0/1背包问题-----回溯法求解

问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品。物品i的重量为w[i],价值为p[i]。一个可行的背包装载是指,装包的物品总重量不超过背包的重量。一个最佳背包装载是指,物品总价值最高的可行的背包装载。 我们要求出x[i]的值。x[i] == 1表示物品i装入背包,x[i] == 0表示物品i没有装入背包。 问题的公式描述是: //总价值最高的可能的背包装载,x

一个程序渣渣的小后院 4673

【0-1背包问题】——回溯法

回溯法,0-1背包问题

qq_52514151的博客 3260

回溯法求解0/1背包问题

linyq@BambooFan ~ 2455

Anomalib实战:从零开始构建自定义数据集的异常检测模型

本文详细介绍了如何使用Anomalib 2.1.0从零开始构建自定义数据集的异常检测模型。通过实战演示,指导读者准备符合规范的数据集结构,快速上手训练Patchcore等先进算法,并完成模型推理与调优,为工业质检、医疗影像等场景提供高效的视觉异常检测解决方案。

weixin_29165465的博客 109

01背包回溯法复杂度_动态规划之——01 背包和最短路径

1. 什么是动态规划动态规划一般用来求解最优问题,这些问题一般都可以分为若干个决策阶段,每次决策对应着一组状态。我们要做的就是寻找出一组决策序列,这组决策序列能产生我们期望的最优解。能用动态规划求解的问题有以下三个特征:最优子结构,当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有最优子结构,也就是我们能通过前面阶段的状态得出后面阶段的状态。无后效性,一是表示前面状态不受后面状态的影响,...

weixin_39713335的博客 1060

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8720

算法分析三(2)——用回溯法求解0-1背包问题

pan.baidu.com/s/1w-VSMWmr9ntEWWdxZoD4Yw 码:jnlh 算法分析与设计第 3 次实验 时间 2020.5.16 实验名称 用回溯法求解0-1背包问题 实验目的 通过上机实验,要求掌握回溯算法的问题描述、算法设计思想、程序设计。 ...

weixin_43973089的博客 3962

4D毫米波雷达天线设计

多种天线布局方案介绍、天线设计要点介绍

5734

IEC 61400-1:2019 附录 C 湍流模型全面解读

IEC 61400-1:2019 附录 C 全面解读

weixin_46713695的博客 471

01背包问题的三种求解方法——动态规划、回溯法、分支限界法的具体思路介绍及对比

具体地介绍了01背包的三种求解方法并且进行对比,附有详细代码和测试样例

m0_57736712的博客 2万+

51单片机 驱动有源/无源蜂鸣器+Proteus仿真

51单片机 驱动有源/无源蜂鸣器+Proteus仿真 相关篇《51单片机 Proteus仿真有源蜂鸣器始终不响原因及解决方法》 电路搭建 采用NPN管驱动有源蜂鸣器电路 采用PNP管驱动有源蜂鸣器电路 采用PNP管驱动无源蜂鸣器 采用NPN管驱动无源蜂鸣器 Proteus元器件列表 实例代码 /************************************************************************************* * 实验现象:下载程序

perseverance51博客 2万+

回溯法——求解0-1背包问题

以前研究过一个简单的N皇后问题,对回溯法也有了个模糊的认识,大致理解就是:先一直做某件事,当完成某个条件时或者是触犯某个条件时,再返回到最近的一个类似还原点的地方。 在用回溯法求解0-1背包问题的时候,主要遇到三个相对难解决的问题:1,什么是界限函数;2,什么时候用它;3,回溯到哪儿。 什么是界限函数? ...

我们的征途是星辰大海 7114

Google Earth Engine(GEE)——全球影像数据正确下载方式和注意事项

今天看到有人担心全球影像能不能下载的问题? 有时候我们会用到全球的数据,但是如何下载全球的数据呢? 首先如果没有全球的矢量边界我们会不会无法下载全球的数据,答案当然是可以的,因为我们在边界筛选的过程中filterBounds(),就是为了筛选边界,当我们不进行边界筛选的时候,自然而然默认的边界范围就是全球的,但是紧接着会面临其他两个问题:1如何下载?2如何在不缩小分辨率的情况下下载成功? 对于第一个问题我们如何下载?还是按照正常的逻辑利用export直接倒出到Google硬盘当中, 代码:

此星光明博客 3771

在 Esp32 摄像头上实现边缘脉冲 FOMO 物体检测

本文将详细介绍如何在 Esp32 摄像头上实现边缘脉冲 FOMO 物体检测,并提供实现源码

DT程序员的博客 705

0-1背包问题——回溯法求解

0-1背包问题:物品总数n,每个物品的体积w[i],价值v[i],给定背包的总容量W,求放入背包中物品的最大价值。 用回溯法对0-1背包问题进行求解,具体思路是: 1.使用解空间进行标记每个物品的放入情况,即要建立一个数组进行保存其是否放入,可使用 bool x[i]进行标识; 2.回溯法第一感觉上是穷举所有情况,但事实上,有好多种情况可以进行避免,即若第t个物品放入后(即x[t]=1)已...

weixin_30600197的博客 2229

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

求解0/1背包问题及左剪枝 回溯法

求解0/1背包问题及左剪枝 #include<stdio.h> #define MAXN 20 int n,W,k; int w[MAXN],v[MAXN]; int x[MAXN]; int maxv=0; void dfs(int i,int tw,int tv,int op[]) { if(i>n) { if(tw==W&&tv>maxv) { maxv=tv;

weixin_47881774的博客 994

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

回溯法求解0-1背包问题

回溯法求解0-1背包问题 #include <iostream> #include <cstdlib> using namespace std; int x[4]={0},y[4]={0}; double w[4]={3,5,2,1},v[4]={9,10,7,4},DV[4]={0}; int n=4,W=7,bestp=0,cp=0,cw=0; struct Dvalu...

weixin_44996854的博客 546

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

回溯法求解0-1背包问题(细节分析)

回溯法求解0-1背包问题(细节分析) 论temp数组的必要性和判断cv>bestv的不必要性 回溯法 应用回溯法求解问题时,首先应明确定义问题的解空间,该解空间应至少包含问题的一个最优解。例如,对于有n种物品的 0-1 背包问题,其解空间由长度为n的 0-1 向量组成,该解空间包含了对变量的所有可能的0-1 赋值。当 n=3 时,其解空间是{ (0, 0, 0), (0, 0, 1), (0...

qq_41878620的博客 2396

java回溯法求解01背包问题_回溯法——求解0-1背包问题

曾经研究过一个简单的N皇后问题,对回溯法也有了个模糊的认识,大致理解就是:先一直做某件事,当完毕某个条件时或者是触犯某个条件时。再返回到近期的一个类似还原点的地方。在用回溯法求解0-1背包问题的时候。主要遇到三个相对难解决的问题:1。什么是界限函数;2,什么时候用它;3,回溯到哪儿。什么是界限函数?例如以下图:当我们身在一棵搜索空间树中,站在一个K点举棋不定的时候。我们能够用它估算假设我们继续向下...

weixin_42119866的博客 1859

回溯法求解0-1背包

实验名称 回溯法求解0-1背包。 实验目的 回溯法求解0-1背包。 实验原理 给定任意几组数据,利用回溯算法的限界与剪枝的思想,求解0-1背包问题并输出答案。 实验步骤 ① 将用例数据从文件中读取,初始化数据; ② 将物品按照单位重量的价值从大到小排序; ③ 从第0层开始进行递归函数Backtrack,   当i>n时,算法搜索至叶子结点,得到一个新的物品装包方案,此时算法适时更新当前的最优价值和最优解;   当i<n时,当前扩展结点位于排列树的第(i-1)层,此时算法选择下一个要安排的

海棠的博客 923

从暴力枚举到高效剪枝:回溯法求解0-1背包的优化之路

本文详细探讨了回溯法在求解0-1背包问题中的优化过程,从基础的暴力枚举到高效的约束剪枝和限界剪枝技术。通过实际代码示例和性能对比数据,展示了如何通过剪枝策略大幅提升算法效率,使其能够处理中等规模的问题。文章还分析了回溯法的适用边界和进阶优化方向,为算法优化提供了实用指导。

weixin_28717431的博客 413
上一篇: 信号量解决进程同步互斥习题
下一篇: 回溯法解决装箱问题
practical_sharp
博客等级 码龄8年 499粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值