初遇动态规划

----来自退役三年的OIer对自己当年的记忆
先来一个经典问题
P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
没有什么想法......
不妨先假设:
假设我现在觉得要不要某一个草药
那我肯定这样思考:比较要这个草药能获得的收益与不要这个草药能获得的收益
假如说我从第1株草药开始选择,一共有 T 的时间
那么我应当考虑第 2-M 株用 T 时间能获得的最大收益 与 第1株的利润+第 2-M 株用 T-t1 时间能获得的最大收益

f(1-n,t)=max( f(2-n,t) , 利润1+f(2-n,t-t1) )

显然,这一切建立在T>=t1的前提下
依照习惯,一般循环从1写到n
故可以改变形式为

f(n,t)=max(f(n-1,t) , 利润n+f(n-1,t-tn))

可用二维数组实现,即为动态规划的最简易形式

代码如下:
#include<iostream>
using namespace std;
int P[101]={0},V[101]={0},s[101][1001]={0};
int main()
{
    int m,n;//P价值,V时间
    cin>>m>>n;//m总时间,n数量 

    for(int i=1;i<=n;i++)cin>>V[i]>>P[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(V[i]>j)s[i][j]=s[i-1][j];
            else s[i][j]=max(s[i-1][j],P[i]+s[i-1][j-V[i]]);
        }
    }
    cout<<s[n][m];
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • DP是用途广泛的问题解决思路/思想,而不是特定的算法。主要用于优化问题(optimisation),求解最优方法。...
    Mc杰夫阅读 216评论 0 1
  • 作为动态规划习题册 目录 1.luogu1417烹调方案[https://www.luogu.com.cn/pro...
    _NewMoon阅读 204评论 0 1
  • 前两篇我总结了链表和二分查找题目的一些套路,这篇文章来讲讲动态规划。动态规划从我高中开始参加NOIP起就一直是令我...
    suoga阅读 1,401评论 1 0
  • 前置:CSP2020-S 组游记(建议先去看那个 QAQ) 对日期的说明 这篇文章所有日期由两部分组成,第一部分是...
    铜李阅读 728评论 0 1
  • 过河卒:https://www.luogu.com.cn/problem/P1002 思路:主要还是要明确状态转移...
    JalorOo阅读 154评论 0 0