算法:动态规划解 0-1 背包问题

Python算法题解:动态规划解0-1背包问题 概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。 定义 我们有 n 种物品,物品 j 的重量为wj,价格为pj。 我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。 如果... 阅读详情


动态规划是用来解决“最优”问题,通过找到最优的子策略来解决这个问题


解决方法

    递归:从结果出发,指导终止条件

    递推:按顺序进行,但可以保存阶段状态


与分治法的区别:


(分治法的步骤:

   分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

    解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

    合并:将各个子问题的解合并为原问题的解。

    例子:汉诺塔

)

在递归过程中,动态规划就是分治法中多了了比较


例子:


0-1背包问题的实现


=============================== 递推 ===================================

#define OBJ_COUNT 4

#define TOTAL_WEIGHT 4


int main() {

    cout << " 0,1 bage" << endl; // prints !!!Hello World!!!


    // 1st dimension,  obj index

    // 2nd dimension, 1:weight; 2: value

    int objs[OBJ_COUNT][2] = { {1,2}, {2,4} , {3,6}, {1,3} ,};


    int v[OBJ_COUNT][TOTAL_WEIGHT+1];


    for(int i=0; i < OBJ_COUNT; i++)

        for (int j=1; j<= TOTAL_WEIGHT; j++ )

            v[i][j] = 0;


    v[0][objs[0][0]] = objs[0][1]; // input the 1st obj


    for ( int i=1; i < OBJ_COUNT; i++) {

        for( int j=1; j<= TOTAL_WEIGHT; j++ ) {

            //cout << "objs[i][0]:" << objs[i][0] << " j:" << j <<endl;

            if ( objs[i][0] > j)

                v[i][j] = v[i-1][j];  //no update, because weight too large

            else if ( objs[i][0] == j)

                v[i][j] = v[i-1][j] < objs[i][1]? objs[i][1]: v[i-1][j];  // 看同权值的总重为 j 的是否权值较小, 取最大权值

            else {  

                int correspondIndex = j - objs[i][0]; //取去掉当前 obj 的总量,

                int newWeight = v[i-1][correspondIndex] + objs[i][1];  // 重新计算

                if ( newWeight >  v[i-1][j])  //取最大权值

                    v[i][j] = newWeight;

            }

        }

    }


    cout << "w: ";

    for (int j=1; j<= TOTAL_WEIGHT; j++ )

        cout << j << "  ";

    cout << endl;


    for ( int i=0; i < OBJ_COUNT; i++){

        cout << i<<": ";

        for (int j=1; j<= TOTAL_WEIGHT; j++ )

            cout << v[i][j] << "  ";

        cout << endl;

    }


    return 0;

}


=============================== 递归 ===================================


#define OBJ_COUNT 4

#define TOTAL_WEIGHT 4

int objs[OBJ_COUNT+1][2] = { {0,0}, {1,2}, {2,4} , {3,6}, {1,3} ,};

int F(int n, int v) {

    if ( n==0 )

        return 0;

    else {

        if ( objs[n][0] > v ) {

            return F( n-1, v);

        }

        else  {

            int a = F( n-1, v);

            int b = F( n-1, v-objs[n][0] ) + objs[n][1];

            return a>b? a: b;

        }

    }

}

int main() {

    cout << " 0,1 bage" << endl;

    cout << F(OBJ_COUNT,TOTAL_WEIGHT);

}



贪心算法与动态规划:从分数背包到0-1背包的算法抉择 贪心算法是一种在每一步选择中都采取当前最优决策,以期获得全局最优解的算法策略。其高效性源于局部最优选择,但应用前提是问题需具备贪心选择性质与最优子结构。在资源分配与组合优化领域,背包问题是经典模型,常被用于评估算法有效性。分数背包问题因物品可分割,满足贪心性质,采用按价值密度排序的贪心策略可在O(n log n)时间内获得最优解,体现了算法在物流装载、资源切割等连续场景中的技术价值。然而,当物品不可分割时,如0-1背包问题,贪心策略可能失效,因其不满足贪心选择性质,需转向动态规划。动态规划通过定义状态与转移 阅读详情

相关推荐

动态规划法解决0-1背包问题

基于MATLAB平台,用动态规划法解决0-1背包问题,较为简单。参数分别为[物品重量,物品价值,背包容量,背包价值]

【算法】动态规划背包问题

动态规划背包问题总结

qq_52092747的博客 1077

使用 DeepSeek 配合 即梦AI 生成视频的详细教程

访问即梦AI官网,选择“AI作图”功能,将DeepSeek生成的提示词逐条粘贴至输入框,选择适配的模型(如“通用XL Pro”)和参数(如画幅比例、风格强度)1113。“我要制作一个关于普洱茶文化的宣传视频,请设计一个30秒的脚本,包含时间轴、画面描述、文案和分镜提示词,以表格形式输出。:云南古茶树群,清晨薄雾,金色晨光,露珠特写,国风山水画质感,16:9画幅,使用Nikon D850参数模拟513。:结合DeepSeek生成的知识点脚本与即梦AI的插画风格,制作科普动画211。

weixin_48995695的博客 3万+

0-1背包问题详解(一步一步超详细)

0-1背包问题详解 1.什么叫背包问题? 背包问题通俗的说,就是假如你面前有5块宝石分别为a, b, c, d, e,每块宝石的重量不同,并且每块宝石所带来的价值也不同(注意:这里宝石的重量的价值没有特定关系),目前我们有一个背包,只有固定的容量,要解决的问题就是在一定容量的背包面前装哪几块宝石才能获取到最大的价值,下面通过一个例子来深入理解背包问题 2.背包问题例子 每种宝石的重量分别为,每块宝石的价值分别为, ...

qq_42051306的博客 2万+

用 dism 合并与删除 wim 映像

一、合并 假设 installA.wim 有 3 个映像,installB.wim 有 1 个映像。 1、全部合并 将 installA.wim 中的 3 个卷映像合并到 installB.wim 中,这样 installB.wim 中的卷映像增加到 4 个。 dism/export-image/sourceimagefile:d:\installA.wim/sourceindex:1/destinationimagefile:d:\installB.wim dism/export-image/source

KefanWon的博客 5200

IEC 62056协议栈深度拆解:从物理层握手到应用层AARQ,一次完整的DLMS通讯抓包分析

本文深入解析IEC 62056协议栈(DLMS/COSEM)的全流程通信机制,从物理层握手到应用层AARQ建立,提供详细的抓包分析和实战指南。涵盖RS-485配置、HDLC帧解析、OBIS编码解读等核心内容,并附有常见故障排查技巧,助力开发者高效实现电能表数据采集。

weixin_29182481的博客 312

0-1 背包问题

小溪汇入河流,江河汇入大海。 动态规划将小问题的解汇集成大问题的答案,一步步引领我们走向解决问题的彼岸。

yuebo_zhao的博客 1411

基于Python的彩票数据爬虫:数据抓取与趋势分析

爬虫是一种用于从互联网上自动抓取信息的程序。在抓取彩票数据时,我们首先需要确定目标网站并获取其网页内容,接着提取彩票的开奖结果信息并保存。彩票数据通常是以HTML表格或列表的形式展示,爬虫可以利用Python的requests和来抓取静态网页,或使用Selenium来抓取动态页面。在本篇博客中,我们深入探讨了如何使用Python编写彩票数据爬虫,抓取并分析彩票开奖结果。通过Python爬虫技术,结合数据分析与可视化工具,我们能够全面分析历史开奖数据,揭示彩票号码的频率分布、趋势变化以及未来的可能走势。

2201_76125261的博客 1939

动态规划解0-1背包问题

动态规划解0-1背包问题 动态规划解0-1背包问题是一个十分典型案例,我从网上查询好多相关资料,但是大部分都深奥难懂,并不适合初学算法的小白,其中涉及的递推关系式、填表,以及最后的二维表简化为一维表的优化过程,好多都是一笔带过,所以,今天就尽我所能,来叙述一下对于0-1背包问题使用动态规划来求解。 要解决0-1背包问题,首先咱们要解决的是什么是动态规划。 动态规划 先说一说什么是动态规划。 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题

weixin_49571787的博客 6432

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 622

联邦学习中的差分隐私保护详解及python实现

随着数据隐私法规(如 GDPR、CCPA)日益严格,传统将数据集中到云端训练模型的方式面临合规与安全风险。联邦学习通过让各客户端保留本地数据,仅共享模型更新,缓解了数据流动带来的隐私风险。但模型更新仍可能泄露个体信息。为进一步保障隐私,可在本地更新中引入差分隐私(DP)机制,通过向梯度或模型更新中注入随机噪声,防止反向推断原始数据citeturn0search9。

闲人编程的博客 1921

动态规划算法解01背包问题(思路及算法实现)

说明:算法源自教材。本文相当于对教材做的一个笔记(动态规划与贪心算法解01背包必须先对背包按照单位重量的价格从大到小排序,否则拆分的子问题就不具备最优子结构的性质) 动态规划算法: 动态规划就是一个填表的过程。该表记录了已解决的子问题的答案。求解下一个子问题时会用到上一个子问题的答案。{比如01背包问题:假如有1个背包,背包容量是10,有5个物品,编号为1,2,3,4,5,他们都有各自的...

远行的博客 8万+

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 643

算法题解:动态规划解0-1背包问题

概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。 定义 我们有 n 种物品,物品 j 的重量为wj,价格为pj。 我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。 如...

weixin_30577801的博客 850

SSE 传输过程中,丢失空格和回车符,怎么解决?

Server - Sent Events(SSE)即服务器发送事件,是 HTML5 中的一项 Web API,用于实现服务器向客户端浏览器推送实时数据的功能。

934

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

python动态规划详解_Python算法题解:动态规划解0-1背包问题

概述背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。定义我们有 n 种物品,物品 j 的重量为wj,价格为pj。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。如果限定每种物品只能选...

weixin_39731807的博客 288

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法导论——动态规划:0-1背包问题(完全解)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34191845的博客 211

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

0-1背包问题

问题描述: 给出背包的容积,商品的价格和商品的体积,在不超过背包容量的情况下,买走价格最大的商品。 (所谓0-1,就是每件商品最多只能选一次,所以这是个很基础的动态规划问题) 商品如下: 方法1:回溯算法 该算法基于以递归的方式建立的枚举算法。 枚举递归的基本思想:要求剩余i件商品,背包剩余容积为c时的最大价格(最优解),只需要求(剩余i-1件商品,背包剩余容积为c时的最优解)和(剩余i-1件商品,背包剩余容积为(c-第i件商品的体积)的最优解加上第i件商品的价格)的最大值。 因为剩余i-1种商品有两种情况

drdtddtrdr的博客 274

0-1背包问题(回溯法)

0-1背包问题是动态规划、贪心策略的一个子问题。回溯算法同样可以适用于0-1背包问题。下面使用回溯算法解0-1背包问题。 文章目录一、问题描述二、算法设计三、实例1、输入:2、2个可行解:3、最优解:<0,1,1,1>四、搜索空间1、子集树的运行2、实例:V={12,11,9,8}, W={8,6,4,3}, B=133、搜索空间:子集树,2^n片树叶4、可行解50、最优解五、代码实现 一、问题描述 有n种物品,每种物品只有1个。 第i种物品价值为vi , 重量为wi, i=1,2,…, n。问

极客园地 2万+

动态规划——0/1背包问题详解(附C++完整代码)

问题分析 背包问题可以通过贪心、动态规划等多种算法解决实现。本文章从动态规划的角度求解0/1背包问题。动态规划原理:是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法方法。0/1背包问题本质上是寻找全局最优解的问题,在尽量消耗小的背包容量的前提下,获得更多的价值。 算法解析 ①首先要对w(容积权重)和v(价值量)两个数组进行初始化,注意因为后面我们在进行动态规划求解时,需要考虑到前一个状态的解,因此这两个数组需要留出数组首位置防止越界。 for(int

freezing_00的博客 5431

动态规划-背包问题

文章目录前言一、0-1背包二、使用步骤1.引入库2.读入数据总结 前言 最近在学习各种背包问题 动态规划知识 记个博客录一下 一、0-1背包 问题描述: 一共有N件物品,第i(i从1开始)件物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少? 分析: 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import

NOTBADCODER的博客 1182

动态规划入坑讲解-背包问题

       其实前文讲解过背包问题,对背包问题是什么有一个描述性的内容。https://blog.youkuaiyun.com/a13407142317/article/details/117934525?spm=1001.2014.3001.5501        说起这个,又想起来大学的时候研究排序算法的时候曾经研究过背包问题,现在要整体搭建自己的知识框架,所以又重头再来研

XiaoCai 502

动态规划之0-1背包问题

首先介绍一下动态规划... 设计一个动态规划算法,通常可按照以下几个步骤进行: (1) 找出最优解的性质,并刻画其结构特征。 (2) 递归地定义最优解的值 (3) 以自底而上的方式计算出最优值 (4) 根据计算最优值时得到的信息,构造一个最优解。 对于一个给定的问题,若具有以下两个性质,则可以考虑用动态规划法来求解。 (1) 最优子结构。如果一个问题的最优解中包含了其子问题的最优解,

码农也有梦 4万+

实验二 动态规划算法 用动态规划法求解0/1背包问题

用动态规划法求解0/1背包问题 一、实验要求与目的 1、掌握动态规划算法求解问题的一般特征和步骤。 2、使用动态规划法编程,求解0/1背包问题。 二、实验内容 1、问题描述:给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大? 2、算法描述。 三、源代码 i...

weixin_34056162的博客 1573
上一篇: 算法:递归解序列中最长递减子序列
下一篇: 算法:求行列式 C语言实现
span76
博客等级 码龄18年 117粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值