澳门新葡亰信誉平台游戏个人经验谈一谈该如何学习编程

by admin on 2020年1月30日

好久没到这里写文章了,这里的博客系统关了挺可惜的 。。

我也算是刚入了编程的门,最近刚找了份 Java
开发的工作,这篇文章想和大家谈一谈该如何学习 Java
或者编程语言,到底该学什么以及学完之后如何找工作。
当然了,这只是我个人的学习经历和想法,希望能够对大家有些帮助。

算法学习 – 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码

昨天有兄弟给我发邮件,说找不到论坛帖子中的一份代码,

澳门新葡亰信誉平台游戏 1

动态规划

我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 –
动态规划(DP问题)(C++)

这里说一下,遇到动态规划应该如何去想,才能找到解决办法。

最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系。

minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[2][i-1] + time[i] + trans[i-1])

今天要讲的问题是01背包问题。

看来代码还是要放在一个不会被删除的地方好啊 。。

1、该怎么学

首先,看一下百度百科对编程语言的定义:

澳门新葡亰信誉平台游戏 2

编程语言

它是一种标准化的交流技巧,任何语言的存在都是为了用来交流沟通的,编程语言也不例外,只不过编程语言的交流对象是计算机而已。计算机本身是没有什么思想的,而我们是采用了一些它能够听得懂的「语言」来让它帮我们做事情的。

计算机是很听话的,你想做什么只需要用编程语言告诉它每一步应该怎么做怎么走就行,之所以编程中会出现
bug
就是因为它前进的过程中找不到自己需要的东西,或者你告诉它的做法它无法理解,这时候计算机就会不开心地停下来。

好,回到正题,那该怎么学编程语言呢,到底是自学好,还是去培训机构学好?

其实这个问题取决于你自己,如果你平常时间充裕而且自制力特别强,当然可以自学,但是自学的话会有一些问题,比如说学习过程中遇到问题出了
bug 该如何解决?自己是不是能够坚持下来?

去正规培训机构学当然也成,但是如果哪个机构说包教包会包分配,找不到工作不收学费,这种情况我建议你还是不要去试水了,天上没有掉馅饼的好事儿,而且正规培训机构只会说给你推荐就业,不会包就业的,谨记。

另外,开始入门的时候你可以看一些经典的编程语言书籍,这个可以自己去网上搜索,比如你想学
Java 就可以去知乎上搜一下自学 Java
应该看哪些书。当然我个人更喜欢看一些视频同步进行学习,这样能给人更直观的感受。

还有,再厉害的程序也是一点点敲出来的,你可能看别人三下五除二就把代码敲出来觉得很简单,但是,千万千万千万不要眼高手低,一定要自己动手操作,另外,你可以自己拥有一个博客,这个博客可以是自己搭建的,也可以去类似
CSDN 的地方自己注册一个,然后把自己敲代码过程中遇到的各种 bug
和学到的知识点整理起来。

遇到问题,首先自己想办法解决,Google
也好百度也罢,看官方文档也行,总之自己先试着解决。如果解决不掉,去虚心请教身边大神或者把你的问题发到一些专业的论坛上,肯定会有大神帮你指点一二的。

01背包

前些日到baidu上开了个博客,这里不会说关就关哈 。。。

2、学什么

很多人可能会有疑惑,说那我到底该学什么呢?

我觉得吧,学什么不是最重要的,重要的是学什么可以找到工作,在理不?

所以说嘛,人家招聘上要求会什么咱就去学什么。来看一下智联招聘关于 Java
的任职要求:

澳门新葡亰信誉平台游戏 3

然后这是京东的要求:

澳门新葡亰信誉平台游戏 4

京东.png

这是搜狐的应聘要求:

澳门新葡亰信誉平台游戏 5

搜狐.png

怎么样,是不是觉得要学的太多了,是不是有点懵逼了?

先说说我个人的看法,首先,要把 Java SE 学好,也就是把 Java
基础打好,这个阶段学好有助于后期框架的学习。比如把多线程、网络通信、设计模式还有
jdbc 等学扎实了,在自己的博客上做笔记,画画思维导图。

面试的时候很多面试官会问你关于 Java SE
的知识,一个两个答不上来还好,接连好几个基础知识都不会,你说多尴尬。

然后,要学习前端的知识,比如 HTML、CSS、Ajax、JQuery 等。虽然 Java
是做后台开发,但是少不了和前端进行交互,所以很有必要学一学。

另外,以后参加工作,做前端的漂亮妹子遇到个问题不会了,来请教你,你说,「啊,这么巧,我也不会唉」,此时你的另外一个男同事凑过了看了一眼说,「姑娘,这个问题我应该可以解决,不如下班以后我们探讨一下?」,然后故事的剧情我就不用说了吧,留你一人独自受尽冷风吹…

数据库的学习也很重要,比如
oracle、MySQL等。好好学学数据库的一些常用函数,以及会写 SQL
语句,以我当时的面试经历来说,没有几家公司不要求写 SQL 语句的。

然后就是框架的学习了,刚接触框架的时候可能会感觉很不适应,各种各样的配置文件会把你搞晕,静下心来,多问多敲,光看可不行,可能你跟着视频或者书本上敲着敲着问题就会少很多。

最后,多看一下网上大神写的代码,学习模仿。最好自己能做个小项目,一来可以把学过的知识都运用起来,二来积累项目经验,为以后工作做准备。

之前有一位大神和我说过,程序员的技能应该达到的几个境界,在这里给大家贴出来,希望大家包括我在内一起努力。

1、框架
2、代码的重构优化
3、redis
4、索引
5、solr
6、Nginx
7、dubbo
8、mycat
9、大数据

澳门新葡亰信誉平台游戏 6

问题描述

01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。

求解这个背包能装的最大价值。(物体不能分割)。

     新地址是:**

3、如何找工作

怎么说呢,如果你还是个学生,暂时就不要考虑这个问题了,本科期间好好提高自己的技能就好了,到了毕业也就不会愁找不到好工作。

如果你已经毕业正在面临转行,那么我个人建议你把技能学的还不错的基础上自己多做做项目,积累项目经验。然后抓住项目中的一个模块,把这个模块的技术难点搞透,面试的时候才能和面试官吹牛逼啊!哦对了,基础知识要学好!

还有就是,多去参加面试,记得面试的时候录音,一定要录音。回来之后把面试官问的问题记下来,对自己的回答情况进行分析,哪些地方自己回答的不好,该如何改进等等。

不要羞于录音,记得有一次我参加面试的时候进行了录音,被面试官发现了之后他反倒夸奖了我,给自己的面试增色了不少。

另外,简历不需要准备的太花哨,简单就行。

以上文章仅代表个人观点,有说的不对的地方还请见谅。祝大家都能走向人生巅峰,迎娶白美和高帅(富是咱们的事儿,哈哈)。

澳门新葡亰信誉平台游戏 7

迎娶白富美

求解思路

这个其实比上一道题难在哪里了呢?
难在上一题装配线始终是两个,不会多,不会少。我们变化的量只有装配站的多少。

这个题目变化的量一个是物品的数量,还有一个是背包的空间。就是说装配线不会随着station的多少而变化,但是背包的空间会随着物品的装入而变化。

所以我们需要做的是判断当背包剩余的空间为j的时候,能否装入第i个物品,并且总价值增加。
即:

d[j] = max ( d[j], d[j-v[i]] + w[i]); //v[i]表示第i个物品的体积,w[i]表示第i个物品的价值。

其实我最开始看到上面这个状态转移的方程的时候,觉得这不是肯定的在空间j的时候放入物品,价值大于不放入物品的。毕竟只要放入就证明增加了价值啊。

其实不是这个样子的,因为只有在最开始都没有装入的时候,所有的都是0.
装入就一定价值增加。但是假如我们的物品如下:

物品1: 空间 2 价值 5
物品2: 空间 4 价值 3

当我们放入第一件物品的时候,假设背包空间是5,那么d[2…5]都是为 5.
因为d[0…1]空间不够所以为0。
当我们放入物品2的时候,d[5] = 5 > d[5 - 4] + 3 因为d[1] = 0;

发现了没有! 并不是放入就一定总价值增加!

所以我们遍历所有物品,从第一个物品开始,找当空间为j的时候,装入物品是否会增加价值!

**不过,百度不能上传文件压缩包,但还好,我们有个小小的交流主页,

代码实现

代码其实行数很少,不好看那些写了两个屏幕的,可能并没有更多的功能。

//
//  main.cpp
//  DP_01backpack
//
//  Created by Alps on 15/4/28.
//  Copyright (c) 2015年 chen. All rights reserved.
//
// 代码中直接定义了石头的数量和背包的空间,其实可以不用提前定义。
// 这里为了方便,而且在C++ 11中可以动态规定数组大小。

#include 
using namespace std;

#ifndef STONE_NUM
#define STONE_NUM 5 //定义石头数量
#endif

#ifndef BACKPACK_SPACE
#define BACKPACK_SPACE 10
#endif

int main(int argc, const char * argv[]) {
    int stoneSpace, stoneValue;//保存当前输入的物品空间和价值
    int value[BACKPACK_SPACE+1] = {0}; //初始化value数组
    for (int i = 0; i < STONE_NUM; i++) {
        scanf(%d %d, &stoneSpace, &stoneValue);//接收物品输入
        for (int j = BACKPACK_SPACE; j > 0; j--) {//当背包空间在不同的时候,** j 一定是从大到小**
            if (j >= stoneSpace && value[j] < (value[j-stoneSpace] + stoneValue)) {//假如背包空间足够,并且放入总价值增加
                value[j] = value[j-stoneSpace] + stoneValue;//放入,并更新总价值
            }
        }
    }
    printf(%d
, value[BACKPACK_SPACE]);
    return 0;
}

这里解释下,为何第二层for循环里,j
是从最大变化到最小的。因为我们比较的是当前物品放入,价值是否有变化,就是
value[j] 和 value[j – v] 比较。 假如更新了,那么 value[j + 1]
需要和 value[j + 1 – v] 比较的值,可能 value[j + 1 –
v]已经被更新过了。就不行了!因为那个时候value[j + 1
-v]的总价值已经算上当前的物品了。再算就重复了。

需要代码的朋友可以到那里找一下:

放入哪些物品

上面的代码没有知道到底放入了哪些物品,其实是因为为了节省空间,没有保存每个
stoneSpace和 stoneValue.
所以我们把它们变成数组就好了。

然后我们首先要做的是:找到一共背包用了多少空间!

这个很重要,因为背包的最大价值不一定是装满了,所以我们要找到用了多少空间,才能知道到底放入了哪些物品。

怎么找呢?

假如我们的value数组如下:

0
0
4
6
9
10
13
15
15
19
19

很容易知道,这个背包剩余了一个空间? 为什么呢,因为最大的19有两个,j
多了1但是价值没有增加,说明这 1的空间没有放入物品,也就是空余了。

这样找到第一个最大得数的下标,就是使用的空间了。

    

代码

比较简单,只不过多了一步查找那些物品放入了,就是当背包空间减去物品空间,总价值也刚好增加了物品的价值数量,那么说明这个物品被放入了。

代码如下:

//
//  main.cpp
//  DP_01backpack
//
//  Created by Alps on 15/4/28.
//  Copyright (c) 2015年 chen. All rights reserved.
//
// 代码中直接定义了石头的数量和背包的空间,其实可以不用提前定义。
// 这里为了方便,而且在C++ 11中可以动态规定数组大小。

#include 
using namespace std;

#ifndef STONE_NUM
#define STONE_NUM 5 //定义石头数量
#endif

#ifndef BACKPACK_SPACE
#define BACKPACK_SPACE 10
#endif

int main(int argc, const char * argv[]) {
    int value[BACKPACK_SPACE+1] = {0};
    int stoneSpace[STONE_NUM],stoneValue[STONE_NUM];
    for (int i = 0; i < STONE_NUM; i++) {
        scanf(%d %d, &stoneSpace[i], &stoneValue[i]);
        for (int j = BACKPACK_SPACE; j > 0; j--) {
            if (j >= stoneSpace[i] && value[j] < value[j-stoneSpace[i]] + stoneValue[i]) {
                value[j] = value[j-stoneSpace[i]] + stoneValue[i];
            }
        }
    }//以上代码几乎无变化,只是存储是数组存储了。
    for (int i = 0; i <= BACKPACK_SPACE; i++) {
        printf(%d
, value[i]);
    }//打印value数组,这里面存放的是,所有物品在背包只有空间i的时候,达到的最大总价值。

    int backPackSpace = BACKPACK_SPACE;// 得到背包空间
    while (value[backPackSpace] == value[backPackSpace-1]) {
        backPackSpace--;//假如背包价值和背包空间-1的时候价值相同,空间 -1
    }//找到一共使用了多少空间
    for (int i = STONE_NUM-1; i >= 0; i--) {
        if (value[backPackSpace] == value[backPackSpace-stoneSpace[i]] + stoneValue[i]) { //假如减去当前物品的空间,总价值刚好和物品的价值相等,说明此物品被放入了。
            printf(%d , i+1);//打印这个物品。i+1是因为物品的下标是从0开始的。
            backPackSpace = backPackSpace - stoneSpace[i]; //背包放入了这个物品,自然空间减少了。
        }
    }

    return 0;
}

整个代码比较简单。 有疑问的留言,可以相互交流。

 

– 01背包问题(动态规划C++) 动态规划
01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划
我在上一篇博客里已经讲…

不过这里我还是会经常来的,把一些新的代码与朋友们一起交流和学习,

祝各位看官天天高兴,生活舒心 。。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图