• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#用递归算法解决经典背包问题

C#用递归算法解决经典背包问题

作者:张玉彬 字体:[增加 减小] 来源:互联网 时间:2017-05-28

张玉彬 通过本文主要向大家介绍了c#递归算法经典实例,c#经典算法,c#排序算法,c#加密解密算法,c#递归算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1.引子

  我们人类是一种贪婪的动物,如果给您一个容量一定的背包和一些大小不一的物品,裝到背包里面的物品就归您,遇到这种好事大家一定不会错过,用力塞不一定是最好的办法,用脑子才行,下面就教您如何解决这样的问题,以获得更多的奖品。

2.应用场景

  在一个物品向量中找到一个子集满足条件如下 :

  1)这个子集加起来的体积大小不能大于指定阀值

  2)这个物品子集加起来价值大小是向量V中所有满足条件1的子集中最大的

3.分析

  背包问题有好多版本,本文只研究0/1版本,即对一个物体要么选用,要么就抛弃,不能将一个物体再继续细分的情况。这种问题最简单的方法就是找出这个向量的所有子集,如同找出幂集中的子集一样,但这种遍历的方法恐怕并不会被聪明的我们所使用,现在举办这些活动的电视台也非常聪明,他们不但要求您能将物品装进去,而且指定操作时间,这样当您慢慢腾腾的装进去倒出来的时候,时间恐怕早就到了,最终您可能一无所获,这可不是我们希望的结果,我们需要使用一些策略:第一次我们可以从大小小于背包容量的物品中随意挑取一个,这样可以尽量争取时间,选取第一个后的每一个我们希望其都是最优的,这样能节省一定的时间。假设有这么一组物品,其大小和价值如下表所示:

物品编号 大小 价值
1 2 1
2 3 4
3 4 3
4 5 6
5 6 8

给我们一个容量为12的背包,让我们装上面这些物品,我们可以用下面的方法来解决寻找最优组合的问题

建立一个二围数组,数组包括n个行(n为物品数量)和capcity+1列

首先我们对第一个物品进行取舍,因为物品1大小为2,先将物品1加入背包,物品1的大小为2,则cap>=2的时候能容纳item1,这时候背包里面物品的价值为item1.Value=1,得到以下数组

0 1 2 3 4 5 6 7 8 9 10 11 12
0 0 1 1 1 1 1 1 1 1 1 1 1

接下来处理物品1和物品2的子集,item2的大小为3,则只有cap=3的时候才能容纳item2,当cap=3的时候讲好能容纳item2,此时背包里面价值item2.value=4,且剩余空间为0,当cap=4的时候,能容纳item2,且剩余空间为1,不能容item1,当cap=5的时候,可以容纳item1+item2,此时的价值为1+4 =5,得到第二行

0 1 2 3 4 5 6 7 8 9 10 11 12
0 0 1 4 4 5 5 5 5 5 5 5 5

下面分析物品三,物品二,物品一的子集,物品三的大小为4,当cap=4的时候就能容纳item3,但此时背包里面的价值为3,明显小于上一行中的cap=4的价值(3<4),所以cap=4时不能将item3放进去,所以第三行的4位置应该和第二行的4位置一致,当cap=5的时候能够容纳item3,且剩余空间为1,和cap=4情况一样,拷贝上一行同一位置的值,当cap=6,放置item3后剩余2,能容item1和item4,二者的总价值:1+3=4<5,故拷贝上一行同位置的值,cap=7的时候,能容item2+item3,总价值大小为7,大于>5,故cap=8的时的值为7,cap=9的时候仍能容难item3+item2,value=7,cap=8的时候,能容纳item1+item2+item3,且总价值大小为8,大于上一行同位置的值,故cap>=9时候,总价值大小为8,第三行:

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#递归算法寻找数组中第K大的数
  • C#用递归算法解决经典背包问题
  • C#快速排序算法实例分析
  • C#二分查找算法实例分析
  • C#中尾递归的使用、优化及编译器优化
  • C#插入法排序算法实例分析
  • C#算法之全排列递归算法实例讲解
  • C#实现排列组合算法完整实例
  • c# 二分查找算法
  • C#计算两个文件的相对目录算法的实例代码

相关文章

  • 2017-05-28C#通过热键控制显示器开关的方法
  • 2017-05-28实现ASP.NET无刷新下载并提示下载完成的开发思路
  • 2017-05-28C#6 null 条件运算符
  • 2017-05-28C# TextBox多行文本框的字数限制问题
  • 2017-05-28c#中文gbk编码查询示例代码
  • 2017-05-28C# WinForm中禁止改变窗口大小的方法
  • 2017-05-28C#实现压缩HTML代码的方法
  • 2017-05-28C#基础语法:结构和类区别详解
  • 2017-05-28C#远程发送和接收数据流生成图片的方法
  • 2017-05-28C#拼接SQL语句 用ROW_NUMBER实现的高效分页排序

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c#详解datetime使用示例
    • C#实现农历日历的方法
    • C#串口编程实例代码
    • C# 设计模式系列教程-单例模式
    • C# cmd中修改显示(显示进度变化效果)的方法
    • C# Winform 子窗体访问父级窗体的控件和属性
    • C# 类的声明详解
    • C#浮点数的表示和基本运算
    • 利用C#如何给PDF文档添加文本与图片页眉
    • C#异步委托调用实例分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有

0 1 2 3 4 5 6 7 8 9 10 11 12
0 0 1 4