前言

动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。

这样一听和分治算法有点相似啊。

是的,分治算法也是将大问题分为小问题,但是他们毕竟不同,不同之处在什么地方呢?

分治算法是这样的,本来有一个大问题,把他们呢分成10个独立的小问题,每个问题都可以单独执行。

而动态规划是这样子的,他一个问题分为10个小问题,解决一个问题需要上一个问题得出的结论,在原先问题解决得基础上得到答案。

这个问题该怎么求呢?

比如我们看电视有很多个频道,我们会经常换台,如果频道多了,那么这时候选择多就出现难选择得问题了。

现在给我4Kg背包,如果给我1kg那么该怎么选呢?现在1kg给我

看下图:

上面这个表格得意思是这样得,比如x轴1磅y轴吉他,这个1500的意思是假如背包只能装1kg,只能选吉他,那么背包价格为1500。

x轴1磅y轴音响的时候,这个1500的意思是假如背包只能装1kg,只能选吉他和音响,那么背包价格为1500。其他类推。

那么这些数据对这个4磅3个都可以选有什么用?

看红色这一块:

这个数据有什么用呢?假设我们4磅都装不下新增可以装的物品电脑,那么可想而知,其实结果就是3000。

为什么这么判断呢?假设装不下电脑,那么可以装的物品数量没变,而且背包大小没变,那么条件没有任何改变自然结果不变。

这时候分析:

1.假如4磅的时候装了3000的音响,那么这时候加入这个可以选电脑条件,那么是没有任何效果,还是3000。

2.假如3磅的时候装了一个电脑,那么多出的一磅该怎么选才最好呢?多出的一磅看下现在条件是啥?

现在的条件是背包1磅,有两个物品可以选这时候可以查表啊,如下图:

因为我们前面已经求出了背包1磅,有两个物品可以选的最优解。

这时候就得出最优解。

正文

代码如下:

int[] weight = {1,4,3 };
int[] val = {1500,3000,2000};
int m = 4;
int n = val.Length;
int[,] wv = new int[n+1,m+1];
//由于wv默认创建数组为0所以不必初始化第一行第一列为0
for (int i = 1; i <n+1; i++)
{
for (int j = 1; j < m + 1; j++)
{
//如果现在背包的质量装不下新增物品的质量
if (weight[i - 1] > j)
{
wv[i, j] = wv[i - 1, j];
}
else
{
//如果可以装下新增的商品,则尝试新增商品,取最大值
wv[i, j] = Math.Max(wv[i-1,j],val[i-1]+wv[i-1,j-weight[i-1]]);
}
}
}
Console.WriteLine(wv[n,m]);
Console.Read();

结果为:

如果要记录加入了什么物品,可以这样。

代码如下:

static void Main(string[] args)
{
//hanoiTower(5,'A','B','C');
int[] weight = {1,4,3 };
int[] val = {1500,3000,2000};
string[] names = {"吉他","音响","电脑" };
int m = 4;
int n = val.Length;
int[,] wv = new int[n+1,m+1];
int[,] path = new int[n+1,m+1];
//由于wv默认创建数组为0所以不必初始化第一行第一列为0
for (int i = 1; i <n+1; i++)
{
for (int j = 1; j < m + 1; j++)
{
//如果现在背包的质量装不下新增物品的质量
if (weight[i - 1] > j)
{
wv[i, j] = wv[i - 1, j];
}
else
{
//如果可以装下新增的商品,则尝试新增商品,取最大值
if (val[i - 1] + wv[i - 1, j - weight[i - 1]] >= wv[i - 1, j])
{
wv[i, j] = val[i - 1] + wv[i - 1, j - weight[i - 1]];
path[i, j] = 1;
} else
{
wv[i, j] = wv[i - 1, j];
}
}
}
}
Console.WriteLine(wv[n,m]);
int a = n;
int b = m;
while (a > 0&&b>0)
{
if (path[a,b]==1)
{
Console.WriteLine("商品名字:"+names[a-1]+"重量:"+weight[a-1]+"价格:"+val[a-1]);
b -= weight[a - 1];
}
a--;
}
Console.Read();
}

结果如下:

重新整理数据结构与算法(c#)—— 算法套路动态规划算法[二十六]的更多相关文章

  1. 浅谈压缩感知(二十六):压缩感知重构算法之分段弱正交匹配追踪(SWOMP)

    主要内容: SWOMP的算法流程 SWOMP的MATLAB实现 一维信号的实验与结果 门限参数a.测量数M与重构成功概率关系的实验与结果 SWOMP与StOMP性能比较 一.SWOMP的算法流程 分段 ...

  2. leetcode算法刷题(四)——动态规划(二)

    又到了晚上,动态规划,开刷! 第121题 Best Time to Buy and Sell Stock 题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格.只 ...

  3. JAVA常见算法题(二十六)

    package com.xiaowu.demo; import java.util.Scanner; /** * Java实现将阿拉伯数字转为汉字 * * @author WQ * */ public ...

  4. 每日算法之二十六:Substring with Concatenation of All Words

    变相的字符串匹配 给定一个字符串,然后再给定一组同样长度的单词列表,要求在字符串中查找满足下面条件的起始位置: 1)从这个位置開始包括单词列表中全部的单词.且每一个单词仅且必须出现一次. 2)在出现的 ...

  5. 机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD(七) 附录

  6. Unity 游戏框架搭建 2019 (二十六) 第一轮整理完结

    昨天呢我们把第八个示例整理完了.整理之后学习了类的第一作用:方法的集合,还有 Obselete 这个 API.并且在进行整理的时候贯彻了我们新的约定和规则:先确保功能有效,再去做变更和删除. 今天我们 ...

  7. 重新整理 .net core 实践篇—————工作单元模式[二十六]

    前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...

  8. 重新整理 .net core 实践篇——— 权限中间件源码阅读[四十六]

    前言 前面介绍了认证中间件,下面看一下授权中间件. 正文 app.UseAuthorization(); 授权中间件是这个,前面我们提及到认证中间件并不会让整个中间件停止. 认证中间件就两个作用,我们 ...

  9. 算法导论——lec 11 动态规划及应用

    和分治法一样,动态规划也是通过组合子问题的解而解决整个问题的.分治法是指将问题划分为一个一个独立的子问题,递归地求解各个子问题然后合并子问题的解而得到原问题的解.与此不同,动态规划适用于子问题不是相互 ...

  10. 动态规划算法详解 Dynamic Programming

    博客出处: https://blog.csdn.net/u013309870/article/details/75193592 前言 最近在牛客网上做了几套公司的真题,发现有关动态规划(Dynamic ...

随机推荐

  1. form 表单提交 保存的时候再提交文件,之前一直是选择文件就传了,这个也比较好

    form 表单提交 保存的时候再提交文件,之前一直是选择文件就传了,这个也比较好 代码 <Upload :action="action" :max-size="ma ...

  2. C#获取Description特性的扩展类

    C#中Description特性主要用于枚举和属性,方法比较简单,记录一下以便后期使用. 扩展类DescriptionExtension代码如下: using System; using System ...

  3. k8s安全之Network Policy

    K8s Network Policy 是一种资源,它用于在 Pod 之间以及从其他网络实体到 Pod 的通信中进行网络级别的访问控制.它允许您定义一组规则,这些规则可以指定允许或拒绝网络流量. 具体来 ...

  4. 没有 Release 文件的解决方法

    https://blog.csdn.net/weixin_44903509/article/details/108825738 sudo apt-get update 出现问题 E: 仓库 " ...

  5. ubuntu 14.04 x64 安装ia32-libs(时间点为2015.1.2)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2015-01-02 22:45:12 ...

  6. 基于Rust的Tile-Based游戏开发杂记(01)导入

    什么是Tile-Based游戏? Tile-based游戏是一种使用tile(译为:瓦片,瓷砖)作为基本构建单位来设计游戏关卡.地图或其他视觉元素的游戏类型.在这样的游戏中,游戏世界的背景.地形.环境 ...

  7. 什么是3D可视化,为什么要使用3D可视化

    虽然许多设计师听说过为什么设计的可视化在他们的审批过程中是有益的,但并不是每个人都知道3D可视化到底是什么. 3D可视化与3D图形.3D渲染.计算机生成图像和其他术语同义使用.3D可视化是指使用计算机 ...

  8. 记录--a标签跳转新地址无法访问,但手动输入新地址可以访问

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 问题描述 最近遇到一个有意思的问题,项目中有一个地方,点击需要跳转到一个新的域名地址 笔者使用a标签做跳转,跳是跳过去了,可是跳过去以后, ...

  9. Python - inspect 模块的简单使用

    Python中的inspect模块解析 Python的inspect模块是一个强大的内省工具,允许开发者检查(inspect)活动对象和源代码.它提供了一系列函数,用于获取信息关于正在运行的程序和调用 ...

  10. 如何使用文件传输协议ftp,教你使用文件传输协议命令行

    FTP是文件传输协议的缩写.顾名思义,FTP用于在网络上的计算机之间传输文件.您可以使用文件传输协议在计算机帐户之间交换文件,在帐户和台式计算机之间传输文件或访问在线软件档案.但是请记住,许多文件传输 ...