牛客考研题组-动态规划专题

一、理解DP

参考博客:https://www.sohu.com/a/149075950_684445

题目国王和金矿的代码:

 1 //动态规划——金矿与工人   
 2 #include <iostream>
 3 using namespace std;
 4 int val[100],gr[100],dp[100],pre[100];
 5 /*参数含义:
 6 val[i]表示第i个金矿存储的黄金量
 7 gr[i]示开辟第i个金矿所需的工人数 
 8 n代表金矿数目,w代表工人数目
 9 */ 
10 int main(){
11     int n,w;
12     cout<<"请输出金矿数目与工人数目:"<<endl;
13     cin>>n>>w;
14     cout<<"请输出每座金矿的黄金量与所需工人量: "<<endl;
15     for(int i = 0;i < n;i++){
16         cin>>val[i]>>gr[i];
17     } 
18     //处理边界--对第一行初始化值 
19     for(int i = 0;i <=w;i++){ 
20         if(i>=gr[0]) pre[i]=val[0]; 
21         else pre[i]=0;
22     } 
23     //状态转移方程
24     for(int i = 0;i < n;i++){ 
25         for(int j = 0;j<=w;j++){  
26             if(j<gr[i]) dp[j]=pre[j]; 
27             else dp[j]=max(pre[j],pre[j-gr[i]]+val[i]);
28         }
29         //更新pre数组
30          for(int j = 0;j<=w;j++) pre[j]=dp[j];
31      }
32      cout<<dp[w]<<endl;
33      return 0;
34 }
输入示例
5 10
400 5
500 5
200 3
300 4
350 3
输出示例
900
输入输出示例

二、01背包问题

物品可分割的装载问题称为背包问题,物品不可分割的装载问题(每种物品只有一个,也即物品只有拿和不拿两种状态)我们可以称之为0-1背包问题。

01背包问题:

有一个背包,最多能承载150斤的重量,现在有7个物品,重量分别为[35, 30, 60, 50, 40, 10, 25],它们的价值分别为[10, 40, 30, 50, 35, 40, 30],

应该如何选择才能使得我们的背包背走最多价值的物品?

 1 #include <iostream>
 2 using namespace std;
 3 int val[200],w[200],dp[200],pre[200];
 4 /*参数含义:
 5 val[i]表示第i个物品的价值
 6 w[i]示开辟第i个物品的重量
 7 n代表物品数目,w代表背包可承载的重量
 8 */
 9 int main(){
10     int n,w_max;
11     cout<<"请输出物品数目与背包重量:"<<endl;
12     cin>>n>>w_max;
13     cout<<"请输出每个物品的重量和价值: "<<endl;
14     for(int i = 0;i < n;i++){
15         cin>>w[i]>>val[i];
16     }
17     //处理边界--对第一行初始化值
18     for(int i = 0;i <=w_max;i++){
19         if(i>=w[0]) pre[i]=val[0];
20         else pre[i]=0;
21     }
22     //状态转移方程
23     for(int i = 0;i < n;i++){
24         for(int j = 0;j<=w_max;j++){
25             if(j<w[i]) dp[j]=pre[j];
26             else dp[j]=max(pre[j],pre[j-w[i]]+val[i]);
27         }
28         //更新pre数组
29          for(int j = 0;j<=w_max;j++) pre[j]=dp[j];
30      }
31      cout<<dp[w_max]<<endl;
32      return 0;
33 }

三、例题

第一题:神奇的口袋

题目链接:https://www.nowcoder.com/practice/9aaea0b82623466a8b29a9f1a00b5d35?tpId=40&tqId=21390&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

题解:https://www.cnblogs.com/yaochen/p/14520600.html

第二题:Coincidence

题目链接:https://www.nowcoder.com/practice/f38fc44b43cf44eaa1de407430b85e69?tpId=40&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

题解:https://www.cnblogs.com/yaochen/p/14520960.html

posted @ 2021-03-11 16:08  saaas  阅读(130)  评论(0)    收藏  举报