动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果 [1]  。 [2]

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 [1]  。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择 [1]  。


第一题:给定硬币的面值种类 * ,每种硬币的个数是不固定的,要支付的金额也是不固定的 * 找钱问题 1 5 10 50 100  排序 * 最少来看 大头 * 500 100 100 10 10 5 500 500 500 500 100 100 100 10 10 10 10 1

package 第八章动态规划和贪心算法;import java.util.Random;
import java.util.Scanner;public class Demo1 {
/*** 给定硬币的面值种类* ,每种硬币的个数是不固定的,要支付的金额也是不固定的* 找钱问题 1 5 10 50 100  排序* 最少来看 大头* 500 100 100 10 10 5 * 500 500 500 500 100 100 100 10 10 10 10 1* * 1 硬币的 每种面值的数量 我不知道* 2  支付的金额我不知道 * 3  支付金额我也不知道 * @param args*/public int[] coins= {1,5,10,50,100,500}; //coins
//  设定数组 用于随机存放生成每种硬币的个数public int[] nums= new int [coins.length];private void init() {for (int i = 0; i < coins.length; i++) {int s=new Random().nextInt(10); //生成个数硬币个数nums[i]=s;System.out.println("面值"+coins[i]+"硬币的数量"+nums[i]+"个");}System.out.println("请输入要支付的金额:");Scanner scanner=new Scanner(System.in);int money=scanner.nextInt();scanner.close();int num=print(money, coins.length-1);System.out.println("最少硬币个数为:"+num);}/*** * @param money  要支付的 1212* @param index 对应下标  5* @return */private int print(int money,int index) {if(money==0 ||index==0)  return money;//       当剩余要支付的钱大于一元硬币所有个数,那说明找不开if(money>0&&index==0) {if(money>nums[index]) {}}
//      根据下标获得当前硬币的面值int curMoney=coins[index];//500//获得需要的个数量int x=money/curMoney;
//      当前硬币有多少个int y=nums[index];//不管是需要个数大于拥有的个数还是小于 总是小于那个int min=Math.min(x, y);//总钱数-个数*当前的int other=money-min*coins[index];System.out.println("需要面值为:"+coins[index]+"的硬币个数为:"+min);
//  调用方法return min+print(other, index-1);}public static void main(String[] args) {new Demo1().init();}}

渡河问题:

package 第八章动态规划和贪心算法;import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;public class Demo2 {private void init() {System.out.println("输入渡河的人数:");Scanner scanne = new Scanner(System.in);int n = scanne.nextInt();scanne.close();// 保存每一个人的渡河时间int[] times = new int[n];for (int i = 0; i < times.length; i++) {times[i] = new Random().nextInt(10) + 1;}System.out.println("排序前:");System.out.println(Arrays.toString(times));// 随机生成的时间是乱序的,肯定需要对每一个人的渡河时间进行排序Arrays.sort(times);// 升序排列,从小到大System.out.println("排序后:");System.out.println(Arrays.toString(times));print(n, times);}/*** * @param n*            渡河的总人数* @param times*            每一个人的渡河时间*/private void print(int n, int[] times) {// 渡河人数一直减少int person = n;// 耗费的渡河的总时间int sum = 0;while (person > 0) {// 总人数一个人if (person == 1) {sum += times[0];break;} else if (person == 2) {sum += times[1];break;} else if (person == 3) {sum += times[1] + times[0] + times[2];break;} else {// 3个人以上的分两种情况考虑// 第一种: 1,4出发 1回来 1,3过去 1回来int s1 = times[person - 1] + times[0] + times[person - 2] + times[0];// 第二种:1,2过去,1回来,3,4过去,2回来,int s2 = times[1] + times[0] + times[person - 1] + times[1];// 因为两种情况不确定每一个人的渡河时间,所有不知道那种方式是最少的时间int min = Math.min(s1, s2);person -= 2;sum+=min;}}System.out.println("渡河花费的最少时间为:"+sum+"秒");}public static void main(String[] args) {new Demo2().init();}}

6个学生按年龄排序。

package 第八章动态规划和贪心算法;import java.util.Arrays;
import java.util.Random;/*** 6个学生按年龄排序* @author MZFAITHDREAM*对象排序*/
public class Demo3 {public static void main(String[] args) {// TODO Auto-generated method stubStudent[] students=new Student[6];for (int i = 0; i < students.length; i++) {students[i]=new Student("张"+i,new Random().nextInt(10)+20, "江西省");System.out.println(students[i]);}Arrays.sort(students);System.out.println("排序后===================================================");for (int i = 0; i < students.length; i++) {System.out.println(students[i]);}}}
package 第八章动态规划和贪心算法;
/*** 比较对象* @author MZFAITHDREAM**/
public class Student  implements Comparable<Student>{private String name;private int age;private String address;public Student() {super();// TODO Auto-generated constructor stub}public Student(String name, int age, String address) {super();this.name = name;this.age = age;this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";}/*** */
//  + 从小到大
//  - 从大到小@Overridepublic int compareTo(Student o) {int a=this.age-o.getAge();
//      return 0;return a*-1;}}

区间调度问题

package 第八章动态规划和贪心算法;import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;/*** 区间调度问题* @author Administrator**/
public class Demo4 {private void init() {System.out.println("输入工作的数量:");Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();scanner.close();//定义数组,存储所有工作的开始时间int[] start=new int[n];//定义数组,存储所有工作的结束时间int[] end=new int[n];//       金钱 随机生成int [] many =new int[n];//定义工作的数组,将每一份工作的开始时间和结束时间封装到一起Job[] jobs=new Job[n];for (int i = 0; i < n; i++) {//随机生成每一份工作的开始时间和结束时间//【1,10】start[i]=new Random().nextInt(10)+1;end[i]=new Random().nextInt(10)+1+start[i];jobs[i]=new Job(start[i], end[i]);
//          随机生成manymany[i]=new Random().nextInt(10)+1;}//将随机生成的乱序时间的工作进行从小到大排序Arrays.sort(jobs);for (int i = 0; i < jobs.length; i++) {System.out.println(jobs[i].toString(i));}print(jobs);}//定义方法,把排好序的所有工作进行挨个比较//以结束时间最早的工作作为第一份工作,//第二份工作的开始时间一定在第一份工作的结束时间之后private void print(Job[] jobs) {//定义变量,用于记录最多能做多少份工作int max=1;//获得第一份工作的结束时间int end=jobs[0].getEtime();for (int i = 0; i < jobs.length; i++) {//判断前一份工作的结束时间是否小于后一份工作的开始时间if (end<jobs[i].getStime()) {max++;end=jobs[i].getEtime();}}System.out.println("最多能做"+max+"份工作");}public static void main(String[] args) {new Demo4().init();}}//工作,开始时间和结束时间class Job implements Comparable<Job>{private int stime;//开始时间private int etime;//结束时间public int getStime() {return stime;}public void setStime(int stime) {this.stime = stime;}public int getEtime() {return etime;}public void setEtime(int etime) {this.etime = etime;}public Job(int stime, int etime) {super();this.stime = stime;this.etime = etime;}public Job() {super();}public String toString(int index) {return "第【"+index+"】工作的开始时间是"+stime+",结束时间是"+etime;}@Overridepublic int compareTo(Job o) {//先按照结束时间进行从小到大排序int x=this.etime-o.etime;if (x==0) {//说明比较的两份工作的结束时间相同,将这两份工作按开始时间进行从小到大排列return this.stime-o.stime;}else {return x;}}}
package 第八章动态规划和贪心算法;import java.util.Random;
import java.util.Scanner;
/*** @author MZFAITHDREAM* 定义三个数组* 理解思路* 创建scanner 用户 输入 一条字符串*第一个数组 随机打印 字母内容 并且排序*第二个数组 进行 将数组 A 倒序排列*第三个数组 将前两个数组进行比较 依次排序* @param args*/
public class Demo5 {
//private void init() {System.out.println("输入生成的字符串的长度");Scanner scanner =new Scanner(System.in);int n=scanner.nextInt();scanner.close();StringBuilder builder=new StringBuilder();for (int i = 0; i < n; i++) {
//          A Zchar a=(char) ((char)new Random().nextInt(26)+65);builder.append(a);}System.out.println("生成字符串为:"+builder.toString());print(builder.toString());}private void print(String s) {
//      字符串倒叙排列 倒叙排列String s1=new StringBuilder(s).reverse().toString();System.out.println("倒叙字符串为:"+s1);int lenght=s.length();//创建空的内存StringBuilder builder =new StringBuilder();
//      循环比较while(builder.length()<lenght) {//       整个字符串进行比较if(s.compareTo(s1)<=0) {
//          s<s1
//          取出数字char c=s.charAt(0);
//          放入数字builder.append(c);s=s.substring(1);
//      否则  }else {
//          从倒叙取出第一个字符char c1=s1.charAt(0);
//          放入数字builder.append(c1);s1=s.substring(1);}}System.out.println("排序后字符串为"+builder.toString());}public static void main(String[] args) {// TODO Auto-generated method stub/*** @author MZFAITHDREAM* 调用方法*/new Demo5().init();
//      System.out.println((int)'A');
//          StringBuilder builder=new StringBuilder("abc");
//          builder.append("1234");
//          System.out.println(builder);}}

背包问题

package 第八章动态规划和贪心算法;import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;/*** 背包问题* 重量不知道* 物品不知道* @author MZFAITHDREAM**/
public class Demo6 {private void init() {System.out.println("输入物品的数量:");Scanner scanner =new Scanner(System.in);int n=scanner.nextInt();//重量为int [] weight=new int[n];for (int i = 0; i < weight.length; i++) {weight[i]=new Random().nextInt(10)+1;}System.out.println("输入背包的总重量");int max=scanner.nextInt();
//      排序Arrays.sort(weight);System.out.println(Arrays.toString(weight));print(weight, max);}private void print(int[]ws,int max) {int num=0;int sum=0;
//      循环遍历for (int i = 0; i < ws.length; i++) {sum+=ws[i];
//          判断当前背包总重量if(sum<=max) {num++;}else {System.out.println("不能再放");break;}}System.out.println("该背包能装物品数量"+num);}public static void main(String[] args) {// TODO Auto-generated method stubnew Demo6().init();}}

体重不同

package 第八章动态规划和贪心算法;import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;/*** * @author MZFAITHDREAM**体重不同*/
public class Demo7 {private void intit() {System.out.println("请输入渡河人数");Scanner scanner = new Scanner(System.in);int n=scanner.nextInt();int[] weights=new int[n];for (int i = 0; i < weights.length; i++) {weights[i]=new Random().nextInt(10)+1;}Arrays.sort(weights);System.out.println(Arrays.toString(weights));System.out.println("输入船的MAX重量");int max=scanner.nextInt();scanner.close();
//      定义变量 用于统计剩余多少人int person=n;int boat=0;
//      定义下标 的开始 与结束 int p1=0;int p2=n-1;while(person>0) {
//      体重不贵超过 两个人一起运走if(weights[p1]+weights[p2]>max) {boat++;person--;p2--;}else {boat++;person-=2;p1++;p2--;}}System.out.println("需要最少"+boat);}public static void main(String[] args) {new Demo7().intit();}}

算法在于自己的实践,在于时间的积累。是一个漫长的过程。我们备战蓝桥杯一个多月的时间,我了解到了只是基础真正的算法高手都在练习算法,因为算法真的能让你的大脑思维提升。这只是我训练的八章成果。算法的在于你要有计算机语言去执行你要实现的功能。面向对象的思维思考问题。

算法基础课第八章动态规划和贪心算法相关推荐

  1. 动态规划与贪心算法比较

    动态规划和贪心算法比较 动态规划: 动态规划一般分为线性动规.区域动规.树形动规.背包动规四类 动态规划程序设计师是对解最优化问题的一种途径.一种方法,而不是一种特殊的算法,并不是一个标准的数学表达式 ...

  2. 53. 最大子序和 golang (动态规划与贪心算法)

    题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续 ...

  3. 活动安排问题的 动态规划和贪心算法

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  4. 从 活动选择问题 看动态规划和贪心算法的区别与联系

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  5. 【Java数据结构与算法】第十八章 动态规划和KMP算法

    第十八章 动态规划和KMP算法 文章目录 第十八章 动态规划和KMP算法 一.动态规划 1.介绍 1.爬楼问题 2.扔鸡蛋问题 3.背包问题 二.KMP算法 1.引入 2.介绍 2.代码实现 一.动态 ...

  6. (转)动态规划和贪心算法的区别

    (转自)http://hi.baidu.com/35661327/blog/item/d5463e17f1e8d011972b439c.html 动态规划和贪心算法的区别 2009-07-27 13: ...

  7. 动态规划法和贪心算法

    动态规划法和贪心算法 csdn第一篇blog. 先说说写文章的好处: 第一,写文章是个学习的过程.写的过程中随着自己的思路的进行,会出现理解不清楚的地方,自然就会翻书或者google的搞明白. 第二, ...

  8. 分治法、动态规划、贪心算法区别

    联系 分治.动态规划.贪心算法都是把一个大的问题给分解成子问题,通过解决子问题来最终解决原问题的. 区别 分治: 子问题不重复时候更适合,重复也能用,效率低,最好动态规划. 动态规划: 重复的公共子问 ...

  9. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

最新文章

  1. android资源目录---assets与res/raw区别
  2. ssh scp文件同步(先不搞了)
  3. OPC向UNIX的演进(OPC evolution toward UNIX)
  4. 《HTTP权威指南》学习笔记——HTTP报文
  5. mysql多线程复制binlog_MySQL并发复制系列一:binlog组提交 (转载)
  6. oracle 等待原因查找,查询引起锁等待的SQL语句
  7. Python_爬虫_BeautifulSoup网页解析库
  8. 华为零售商品识别一等奖方案
  9. 鸿蒙OpenHarmony hi3516开发板,标准系统实现智能门禁
  10. Plustoken重要操盘手已被遣返回国,警方正全力侦查
  11. 006-Sencha Cmd概论
  12. 流行编曲(5)采样、小打、Pad、声场
  13. HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019
  14. 合工大计算机与信息学院保研,合肥工业大学计算机与信息学院(专业学位)计算机技术保研夏令营...
  15. 徽章系列3: Travis CI 的使用
  16. linux arm内核栈切换,linux-kernel
  17. 广东开放大学形考任务财务会计(二)(专,2022秋)形成性考核3答案
  18. android+第三发输入法控制,android输入法属性使用,软键盘隐藏、显示状态控制大揭秘...
  19. 报错解决Error parsing Mapper XML
  20. (c语言) 计算油费

热门文章

  1. kettle----------什么是kettle
  2. 忆软件架构师考试之旅
  3. P(AB),P(A|B)
  4. 无法定位序数 12384 于动态链接库 mfc90.dll
  5. Mysql的Derived派生表查询优化
  6. Communications link failure 解决方法
  7. 第K大/Top K及其简单实现
  8. 中国新的大跃进时代:那些可怕的国际化大都市
  9. Flash的坑之ExternalInterface.call只返回null值的解决办法
  10. rac的crs进程是做什么的_RAC 管理(crs_stat、crsctl、srvctl各种命令详解)