当前位置:   article > 正文

备战蓝桥杯 Day10(背包dp)

备战蓝桥杯 Day10(背包dp)

01背包问题

1267:【例9.11】01背包问题

【题目描述】

一个旅行者有一个最多能装 M� 公斤的背包,现在有 n� 件物品,它们的重量分别是W1,W2,...,Wn�1,�2,...,��,它们的价值分别为C1,C2,...,Cn�1,�2,...,��,求旅行者能获得最大总价值。

【输入】

第一行:两个整数,M�(背包容量,M<=200�<=200)和N�(物品数量,N<=30�<=30);

第2..N+12..�+1行:每行二个整数Wi,Ci��,��,表示每个物品的重量和价值。

【输出】

仅一行,一个数,表示最大总价值。

【输入样例】

10 4
2 1
3 3
4 5
7 9

【输出样例】

12

方法一:搜索(时间复杂度高--O(2^n)) 

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 30;
  4. int m,n,v[N], w[N];
  5. int mx;
  6. bool vis[N];//标记
  7. //搜索状态curV当前已选物品的总价值,curW当前已选物品的总重量
  8. void dfs(int curV, int curW,int dep) {
  9. if (curW > m) return;//拦截非法的curV
  10. mx = max(mx, curV);
  11. //5.通用终止条件
  12. if (dep == n + 1) return;//一共n件物品,n件物品已经搜完了,结束
  13. //找出搜索所有方案里面的最大价值
  14. //1.枚举方案
  15. for (int i = 1; i <= n; i++) {
  16. //2.判断标记-防止重复搜索
  17. if (!vis[i]) {
  18. //3.标记+搜索
  19. vis[i] = 1;
  20. dfs(curV + v[i], curW + w[i], dep + 1);
  21. //4.回溯
  22. vis[i] = 0;
  23. }
  24. }
  25. }
  26. int main() {
  27. cin >> m >> n;
  28. for (int i = 1; i <= n; i++) {
  29. cin >> w[i] >> v[i];
  30. }
  31. dfs(0, 0, 1);//初始状态
  32. cout << mx << endl;
  33. return 0;
  34. }

方法二dp

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 30, M = 2e2 + 10;
  4. int m,n,v[N], w[N];
  5. int dp[N][M];
  6. /*
  7. 01背包
  8. 特点:n件物品,每件物品只有一件,要么选(1),要么不选(0)
  9. 朴素版本
  10. 状态 dp[i][j] 前i件物品在背包容量不超过j的前提下构成的最大价值
  11. 状态转移方程
  12. if(j<w[i]) dp[i][j]=dp[i-1][j];//放不下,不放
  13. else if(j>=w[i]) dp[i][j]=max(dp[i-1][j-w[i]]+v[i]放,dp[i-1][j]不放)//可以放
  14. 滚动数组优化
  15. dp[]
  16. */
  17. int main() {
  18. cin >> m >> n;
  19. for (int i = 1; i <= n; i++)
  20. cin >> w[i] >> v[i];
  21. //时间复杂度O(n^2)
  22. for (int i = 1; i <= n; i++) {
  23. for (int j = 1; j <= m; j++) {
  24. if (j < w[i]) dp[i][j] = dp[i - 1][j];//放不下,不放
  25. // 放1 不放0
  26. else if (j >= w[i]) dp[i][j] = max(dp[i - 1][j - w[i]] + v[i], dp[i - 1][j]);//可以放
  27. }
  28. }
  29. cout << dp[n][m] << endl;
  30. return 0;
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/143958?site
推荐阅读
相关标签
  

闽ICP备14008679号