博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划问题
阅读量:4957 次
发布时间:2019-06-12

本文共 1431 字,大约阅读时间需要 4 分钟。

  参考

  先从一个基本的例子上手

  我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?

  令n=f(v),表示n个硬币可凑齐v元,现在需要求n的最小值

  当v为0时,f(0)=0

  当v为1时,可以取1元硬币了,我取1个1元硬币,f(1)=1+f(1-1) 

  当v为2时,可以取1元硬币,我取1个1元硬币,f(2)=1+f(2-1)=2

  当v为3时,可以取1元硬币和3元硬币,我可以取1个1元或者1个3元,f(3)=min(1+f(3-1),1+f(3-3))=1

  当v为4时,可以取1元硬币和3元硬币,我可以取一个1元或者1个3元,f(4)=min(1+f(4-1),1+f(4-3))=2

  当v为5时,可以取1元硬币、3元硬币和5元硬币,f(5)=min(1+f(5-5),1+f(5-3),1+f(5-1)))=1

  够了,通项f(v)=min(f(v-x[j])+1)  x[j]表示各种面值

1 int getMin(int v,vector
& x){ //x[0]=1,x[1]=3,x[2]=5 2 int temp[100]={
0}; //其实只用保证temp[0]=0就可以了 3 int flag; 4 for(int i=1;i<=v;++i){ 5 flag=1000; 6 for(int j=0;j
temp[i-x[j]]+1){ 8 flag=temp[i-x[j]]+1; 9 }10 }11 temp[i]=flag;12 }13 return temp[v];14 }

  小结一下,动态规划就是在寻找状态方程f(v)=min(f(v-x[j])+1)

  再上一个例子

  找出序列的最长非递减子序列的长度,eg,序列为5,3,4,8,6,7

  令n=f(v),表示前v个数的最长非递减子序列为n

  当v=1时,f(1)=1

  当v=2时,第2个数比第1个小,f(2)=1

  当v=3时,第3个数比第2个大,f(3)=f(2)+1

  当v=4时,第4个数比第1、2、3个数大,f(4)=max(f(1)+1,f(2)+1,f(3)+1)

  够了,状态方程f(v)=max(1,f(j)+1)    j<v&&a[v]>=a[j]

 

1 int getMax(vector
& a){ 2 if(a.empty())return 0; 3 int b[1000]={
1}; 4 int flag=1; 5 for(int i=0;i
=0;--j){ 7 if(a[i]>=a[j]&&b[i]

 

转载于:https://www.cnblogs.com/smallby/p/4585599.html

你可能感兴趣的文章
toad for oracle中文显示乱码
查看>>
SQL中Group By的使用
查看>>
错误org/aopalliance/intercept/MethodInterceptor解决方法
查看>>
Pylint在项目中的使用
查看>>
使用nginx做反向代理和负载均衡效果图
查看>>
access remote libvirtd
查看>>
(4) Orchard 开发之 Page 的信息存在哪?
查看>>
ASP.NET中 GridView(网格视图)的使用前台绑定
查看>>
Haskell学习-高阶函数
查看>>
深入了解Oracle ASM(二):ASM File number 1 文件目录
查看>>
Boosting(提升方法)之AdaBoost
查看>>
链接元素<a>
查看>>
Binding object to winForm controller through VS2010 Designer(通过VS2010设计器将对象绑定到winForm控件上)...
查看>>
Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
查看>>
第二章:webdriver 控制浏览器窗口大小
查看>>
【动态规划】流水作业调度问题与Johnson法则
查看>>
Python&Selenium&Unittest&BeautifuReport 自动化测试并生成HTML自动化测试报告
查看>>
活现被翻转生命
查看>>
POJ 1228
查看>>
SwaggerUI+SpringMVC——构建RestFul API的可视化界面
查看>>