牛客考研题组-动态规划专题
一、理解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