初遇动态规划

----来自退役三年的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
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<

你可能感兴趣的:(初遇动态规划)