【算法】一个背包问题

算法导论随笔(六):贪心算法Greedy algorithm与分数背包问题(附Python实现源码) 上一篇文章中我介绍了霍夫曼编码,并提到了它是贪心算法的一个应用。这篇文章我继续来谈谈贪心算法和它解决的一个经典问题,分数背包问题。 1.贪心算法 在《算法导论》中,对贪心算法是这样描述的: 求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择。贪心算法就是这样的算法,它在每一步都作出当时看起来是最佳的选择。也就是说,它总是作出局部最优的选择,寄希望这样的选择能导致全局最优解。 我们可以看出,贪心算法在每一步中只作出当时看起来是最佳的选择。也就是说,贪心算法并不能保证对于每一个问题都能得 阅读详情

2020-09-23

背包问题可以说是动态规划的经典问题了,围绕背包问题能够衍生出很多类似的问题。动态规划看起来不是那么好解决,它涉及到重复子问题和最优子结构,还有状态转移方程的寻找。充分理解了动态规划背后的逻辑,就会理解到其实它真正的原理就是穷举,但它是聪明地进行穷举。

今天遇到一道题,类似思路类似于背包问题。

问题描述

//在计算机界中,我们总是追求用有限的资源获取最大的收益。
//
// 现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。
//
// 你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。
//
//
//
// 示例 1:
//
// 输入: strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3
//输出: 4
//解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 “10”,“0001”,“1”,“0” 。
//
//
// 示例 2:
//
// 输入: strs = [“10”, “0”, “1”], m = 1, n = 1
//输出: 2
//解释: 你可以拼出 “10”,但之后就没有剩余数字了。更好的选择是拼出 “0” 和 “1” 。
//
//
//
//
// 提示:
//
//
// 1 <= strs.length <= 600
// 1 <= strs[i].length <= 100
// strs[i] 仅由 ‘0’ 和 ‘1’ 组成
// 1 <= m, n <= 100

首先定义好dp,dp[i][j][k] 表示在前 i 个字符串的情况下有 j 个 0 和 k 个 1 时能够拼出数组中的字符串的最大数量。
则状态转移方程为 dp[i][j][k] = max(dp[i - 1][j][k], dp[i - 1][j - zero_num][k - one_num] + 1)

代码如下:

    public int findMaxForm(String[] strs, int m, int n) {
        if (strs == null || strs.length == 0)
            return 0;
        int[][][] dp = new int[strs.length + 1][m + 1][n + 1];
        for (int i = 1; i <= strs.length; i++) {
            int zero = zerocount(strs[i - 1]);
            int one = strs[i - 1].length() - zero;
            for (int j = 0; j <= m; j++) {
                for (int k = 0; k <= n; k++) {
                    if (j >= zero && k >= one)
                        dp[i][j][k] = Math.max(dp[i - 1][j][k], dp[i - 1][j - zero][k - one] + 1);
                    else
                        dp[i][j][k] = dp[i - 1][j][k];
                }
            }
        }
        return dp[strs.length][m][n];
    }
    public int zerocount(String str) {
        int len = str.length();
        int count = 0;
        for (int i = 0; i < len; i++) {
            if (str.charAt(i) == '0')
                count++;
        }
        return count;
    }
【贪心算法】背包问题 在之前的《算法设计与分析》课程的学习中,我们就接触到了贪心算法解决背包问题,当然还有动态规划法解决0-1背包问题等等。今天我就来分析贪心法解决背包问题。为了大家可以理解贪心算法,我先分享一道比较简单的题目。问题描述:给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No; 第一行有一个整数0问题分析:看到这个 阅读详情

相关推荐

【背包问题】基于matlab遗传算法求解多背包问题【含Matlab源码 122期】

遗传算法求解多背包问题 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2945

编写一个背包问题算法

背包问题是一种经典的运筹学问题,它试图在有限的背包容量内选择最大价值的物品。下面是一种用动态规划解决背包问题的算法: 定义状态:设f[i][j]表示前i个物品,容量为j的背包的最大价值。 状态转移方程: a. 当第i个物品不放入背包时:f[i][j]=f[i-1][j] b. 当第i个物品放入背包时:f[i][j]=f[i-1][j-w[i]]+v[i],其中w[i]表示第i个物品的重量,v[...

weixin_35756637的博客 73

踩坑ubuntu24.04 编译vtk9.3.1的安卓版本

NDK官方明确废弃了旧版 armeabi ABI,强制使用armeabi-v7a或arm64-v8a。错误信息显示你的构建系统仍在使用超级构建(superbuild)模式,并且内部引用了已不再支持的。生成的合并库: $(pwd)/libvtk_combined.a"超级构建过程可能内部未充分考虑现代NDK变化导致内部配置ARM老ABI,重复失败。echo "正在提取所有.o文件..."echo "合并前所有库的总大小:"# 提取所有.a文件中的.o文件。echo "创建合并库..."

zhangyihu321的专栏 1892

最新的一个面试的算法题目——一个完全背包问题

一个集合x有都不相同的n个元素,使用这个集合中的不定个数的元素,组成一个和为s的序列,求出所有符合的序列,元素可以重复使用,只要元素的个数相同不考虑顺序。 比如集合是x={2,3,4,5,7}; n=5, s=12可以得出以下的序列: 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 2 2 2 2 4 2 3 3 4 2 2 4 4 4 4 4 2 2 3 5

hysfwjr的专栏 850

3张RTX 4090就能跑!BAGEL-7B多模态模型本地部署避坑指南(附Flash Attention安装技巧)

本文详细介绍了如何在3张RTX 4090显卡上本地部署BAGEL-7B多模态模型,包括硬件配置、环境设置、多卡并行优化及常见问题解决方案。特别提供了Flash Attention安装技巧和显存优化策略,帮助开发者高效运行这一开源多模态模型,实现文本与图像生成任务。

1a2s3d4f5g的博客 653

从接线到组态:手把手教你搞定PROFIBUS-DP与PA的混合网络搭建(基于西门子TIA Portal)

本文详细介绍了PROFIBUS-DP与PA混合网络的搭建方法,基于西门子TIA Portal平台,从硬件选型、网络架构设计到组态配置和现场调试,提供了一套完整的实战指南。重点解析了DP/PA耦合器的使用、地址映射策略及网络诊断技巧,帮助工程师高效构建高可靠性的工业自动化网络。

weixin_32103009的博客 302

实现一个动态规划算法,解决背包问题

/ 否则比较放入当前物品和不放入当前物品两种情况的最大价值。// 当前物品重量大于背包容量,无法放入,取上一个状态的值。// 创建一个二维数组dp,用于记录状态转移过程。// 返回背包问题的最优解。// 动态规划解决0-1背包问题。// 计算获得的最大价值。

m0_45127365的博客 591

Log4Shell漏洞复现:从原理到实战的完整指南

日志记录是软件开发中用于追踪应用状态和排查问题的关键技术。然而,当日志组件对用户输入进行不当解析时,可能引发严重的安全风险。Log4j2作为Java生态中广泛使用的日志框架,其Lookup功能允许在日志中动态插入变量,这一设计初衷虽为便利,却因递归解析机制埋下了隐患。攻击者通过构造特定的JNDI(Java命名和目录接口)查询字符串,可诱使应用加载并执行远程恶意代码,从而实现远程命令执行。这种漏洞的价值在于其极低的利用门槛和极高的潜在危害,常被用于渗透测试和安全评估中,以验证系统的防御能力。本文以CVE-20

weixin_30496999的博客 276

一个算法一个例题教会你算法---0-1背包问题

后继j=3,j=4,j=5,同理。因为,我们现在只考虑第一个物品入背包的情况,所以最大价值都为3.我们列一个背包重量 j 从0到5的表格,纵轴 i代表每个物品的序号。j=0时,背包载重为0不能放下任何物品,第一列我们直接先全部填0.当j=1时,书包载重小于物品重量,因此i=1,j=1时总价值为0。i=1,代表现在只有第一个物品可以装入书包。此时,前两个物品我们都可以选择,然后再看背包重量的变化。现在有四个可以放的物品,w代表重量,v代表价值。在j=0时,我们为了方便选择将第一列全部填0。

weixin_45803282的博客 554

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

3.详解Labview串口通讯--从串口线连接到串口通讯保姆级教程

本文非常详细的介绍了使用Labview实现串口通讯,读完题主这篇文章,即使你是今天刚下载的Labview,也能熟练的连接并驱动串口执行,接下来和我一起学习下,记得关注并点赞不迷路

关注我,更多技术问题欢迎私聊~ 1万+

多重背包问题matlab,一个类似背包问题的遗传算法:价值和最小,重量有下限

clcclear allclose all% 容量低限值 ww = 2000;% 容量unit_capacity =[1000,1000,680,660,500,800];% 费用unit_shutdowncost = [3,4,1,2,3,1];n = length(unit_capacity);%% 随机产生数量为n的种群。生成n*n的0-1矩阵。So = round(rand(n*10,...

weixin_31487917的博客 729

069、自动曝光(AE)测光策略:全局/中心/点测光与曝光时间增益分配

本文深入探讨了自动曝光(AE)测光策略的技术细节与实际应用。作者通过多个真实案例(手机前置摄像头、车载ADAS、安防监控等)分析了全局测光、中心测光和点测光的优缺点,指出不同场景应采用不同策略。重点剖析了曝光时间与增益分配的"跷跷板效应",提出要根据传感器特性选择最优分配方案。文章强调测光策略应动态调整,并给出5条实用建议:结合场景切换测光模式、关注传感器增益拐点、点测光需防抖处理、全局测光不宜迷信、调试要观察亮度直方图。最后指出AE调试需要结合具体硬件特性进行实测优化,没有通用解决方案。

zzfmlxs的博客 102

【算法 | 背包专题】有依赖的背包问题,多个物品变成一个复合物品(互斥)

在有依赖的背包问题中,多个物品可以被视为一个复合物品,这些物品之间可能存在互斥关系(即,选择了一个就不能选择另一个)。同时,每个复合物品可能有多种选择方式。

翼同学 2201

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

老版QQ原生表情gif动态

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

【算法从入门到忘了入门到哪了PYTHON】动态规划背包问题傻瓜版,可能是说的最白话的了,就一个公式,例子又多。

背包问题 看了一天终于看懂了大概,赶紧记下来。本人无计算机学习背景,为方便同小白和我自己再忘了的时候理解。 起因 来源于一到题目,找零钱。 coins=[1,2,5],amount = 11,求最少需要的硬币数。 对于没接触过这类问题的我: 第一思路,贪心,挨个求余数。 余数的问题是顺序会产生影响。比如硬币5,3,4对总数11。贪心的先用5求余数,发现余1,GG。必须从3或者4开始算才能把结果求出来。如果硬币池子更大,原地爆炸。 第二思路,暴力枚举,反正都是整数,硬币又不能掰开花。但想都不用想池子大了这复杂

weixin_45279350的博客 292

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

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

01背包问题算法C语言,0.背包问题C语言算法 给定n种物品和一个背包 - 下载 - 搜珍网...

给定n种物品和一个背包,物品i的重量是Wi,价值是vi,被包容量是C,应该如何选择装入被包的物品,使得装入背包中物品的总价值最大?对于每种物品i,只有两种选择,装入或者不装入.输入:第一行两个正整数n(物品数)和C(容量)第二行n个正整数n,表示物品价值第三行n个正整数n,表示物品重量输出:第一行表示总价值第二行n个数(0/1),0表示物品不装入,1表示装入例如,输入:5 106 3 5 4 62...

weixin_39567046的博客 450

用贪心算法解决背包问题

设有背包问题时实例n=7,m=15,(w0,w1,...,w6)=(2,3,5,7,1,4,1),物品装入背包的收益为:(p0,p1,...,p6)=(10,5,15,7,6,18,13)。先选入1号物品,再选入2号物品,但由于背包的容量剩余20-15=5,因此2号物品装入1/2,0号物品不装入,这样得到的解为(x0,x1,x2)=(0,1,1/2),它的总收益为31.5,总收益最大。贪心算法只是一种算法,它是基于贪心策略来编写的算法,贪心算法可以看作是贪心策略的具象化,算法是具体的,策略是模糊的。

2301_76572283的博客 4433

遗传算法与背包问题

遗传算法 遗传算法的关键步骤: 基因编码 设计初始群体 计算适应度 产生下一代 背包问题   背包问题是一种组合优化的NP问题。问题为:有N件物品和一个容量为V的背包,第i件物品的质量是w[i],价值是v(i),求将哪些物品装入背包满足不超过背包容量且可使得总价值最大化? 这种问题一般验证一种猜想的解比算出问题的一组解简单的多。   看如下具体的问题,假设有一个背包,总容量为80kg,此外,有...

qq_35027690的博客 2698

背包问题的贪心算法

 背包问题是一个经典的问题,到现在还没有多项式时间的算法去解决它.本文是背包问题的贪心算法,当然是一个非多项式算法. #include iostream>#include vector>#include algorithm>using namespace std;struct Treasure...{    int no;    int quantity;    int price; 

BigBear's Tech. Blog 2342

【算法】退火算法+背包问题 python

退火算法例题 python代码解决

qq_51669241的博客 2315

【算法】贪心算法解决部分背包问题

算法 golang 部分背包问题

lijiaze_csdn的博客 1739

背包问题 贪心算法_python--利用贪心策略实现背包问题

贪心算法是的思想是构造局部最优,难以顾全大局.它通常表现出的特点是:1.无法保证求得的解是最优解;2.运用简单;3.算法的实现过程中,通常要用到排序:能采用贪心算法求解最优解的问题,一般具有的重要性质为:最优子结构性质与贪心选择性质最优子结构性质的含义是:问题的最优解包含其子问题的最优解代码如下:#建立商品类class goods:def __init__(self, name, weight=0...

weixin_28775337的博客 670

数学建模之贪心算法(背包问题)

什么叫贪心算法: 贪心算法就是遵循某种既定原则,不断地选取当前条件下最优的选择来构造每一个子步骤的解决方案,直到获得问题最终的求解。即在对问题求解时,总是做出在当前看来是最好的选择,也就是说,不从整体最优上加以考虑,所做的仅是在某种意义上的局部最优解。 贪心算法适合解决的问题: 1.背包问题(注意0-1背包问题不能用贪心算法解决,所得到的解通常不是最优解) 背包问题与0-1背包问题的区别就是背包问题能将物品的部分放入到背包中,而0-1背包问题只有将物品整个放入或者不放入。 0-1背包问题求解可以用动态规划以

kaakllhjkhjalv的博客 5477

华科复试算法基础:贪心算法基础和背包问题

但是

weixin_44225940的博客 561

用贪心算法求解背包问题

但这最后一次的方法可能不符合使背包每次获得最大效益增量的量度标准,这可以换一种能获得最大增量的物品,将它(或它的一部分)放入背包,从而使最后一次装包也符合量度标准的要求。已知有n种物品和一个可容纳M重量的背包,每种物品i的重量为。显然,由于背包容量是M,因此,要求所有选中要装入背包的物品总重量不得超过M.。现需解决的问题是,这些物品重量的和大于M,该如何装包。//P(1:n)和W(1:n)分别含有按P(i)/W(i)≥P(i+1)/ W (i+1)排序的n件物品的效益值和重量。求所给背包问题的最优解。

stationinthemind的博客 1749
上一篇: ---开学札记---
下一篇: 【小记】如何保证缓存和数据库的一致性
皮皮蟹01
博客等级 码龄10年 29粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值