学习日记—线性DP之背包问题

线性DP学习笔记:

一、什么是线性DP

  线性DP是动态规划问题中的一类问题,指状态之间有线性关系的动态规划问题。(可以理解为DP中最简单的一种)

二、典型例题

  说到DP即使没学过也应该略有耳闻,这其中似乎有一类题跟DP就好像绑定在了一起,那就是背包问题。——作者(2022年5月12日)[手动狗头]

  1.P1048[NOIP2005普及组]采药(01背包)洛谷传送门

    题目描述

 

      辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”如果你是辰辰,你能完成这个任务吗?

 

    输入格式

 

      第一行有 22 个整数T1T1000)和M1M100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100的整数,分别表示采摘某株草药的时间和这株草药的价值。

 

    输出格式

 

      输出在规定的时间内可以采到的草药的最大总价值。

 

    输入输出样例

 

      输入 
        70 3
       71 100
       69 1
       1 2
      输出 
        3 
 
    分析:DP题写起来不难,但公式难推,我们观察,每种草药只有一株,而且每一株草药只有采和不采两种状态,所以我们就可以写爆搜了得出以下状态转移方程:
        dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
    相信大家都已经迫不及待想去写了,但是,大家看一下它的空间复杂度O(T*M)这复杂度不算大,但duck不必怎么浪费空间,我们可以优化成一个一维数组,就像斐波那契数列可以优化成3个变量一样,优化后的状态转移方程长这样:
        dp[j]=max(dp[j],dp[j-w[i]]+v[i])
    时间复杂度没变但空间复杂度变成了O(M),然后我们倒推一下就行了,注意为什么是倒推原因就是如果正推会出现一种草药采了好几遍的情况,那就不符合题意了,题目说的是一种草药只有一株,也就是只能采一遍,话不多说上代码(!!严禁抄袭,抄袭可耻!!)
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int t,n,dp[1005],w[1005],v[1005];
 5 int main() {
 6     cin>>t>>n;
 7     for(int i=1;i<=n;i++)cin>>w[i]>>v[i];
 8     for(int i=1;i<=n;i++){
 9         for(int j=t;j>=w[i];j--)dp[j]=max(dp[j],dp[j-w[i]]+v[i]);//状态转移方程
10     }
11     cout<<dp[t];
12     return 0;
13 }

  2.P1616疯狂的采药(完全背包)洛谷传送门

    题目跟上一题采药很像,但不一样的是这次每种草药不止一株而是有无数株,无限采所以是疯狂采药,言归正传这题听完我的描述是不是觉得很眼熟,这不就是上一题我们强调倒推是所讲的正推吗,所以上代码(!!严禁抄袭,抄袭可耻!!)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll t,n,dp[10000005],w[10005],v[10005];
 5 int main() {
 6     scanf("%ld%ld",&t,&n);
 7     for(int i=1;i<=n;i++)scanf("%ld%ld",&w[i],&v[i]);
 8     for(int i=1;i<=n;i++){
 9         for(int j=w[i];j<=t;j++)dp[j]=max(dp[j],dp[j-w[i]]+v[i]);//只有这的for不一样 
10     }
11     printf("%lld",dp[t]);
12     return 0;
13 }

  最后说一句记得看数据范围不开long long见祖宗

  有错误欢迎指出,写博不易点个赞呗

posted @ 2022-05-12 12:59  2009cqr  阅读(110)  评论(0)    收藏  举报