题目大意:

有 $n$ 个物体 第 $i$ 个物体的体积为 $wi$ 价值为 $vi$ 背包容积为 $W$ 求所有挑选方案中价值总和的最大值

解法1:

针对每个物品是否放入背包进行搜索

时间复杂度:$O(2^n)$

代码:

#include <bits/stdc++.h>
using namespace std;const int maxn = 1e5 + 10;
int n, W;
int w[maxn], v[maxn];int rec(int i, int j) {int res;if(i == n)res = 0;else if (j < w[i])res = rec(i + 1, j);elseres = max(rec(i + 1, j), rec(i + 1, j - w[i]) + v[i]);return res;
}void solve() {printf("%d\n", rec(0, W));
}int main() {scanf("%d%d", &n, &W);for(int i = 0; i < n; i ++)scanf("%d%d", &w[i], &v[i]);solve();return 0;
}

解法2:

记忆化搜索,把第一次计算结果存到 $dp$ 数组中,第二次之后如果有同样的 $i, j$ 直接返回

时间复杂度:$O(n * W)$

代码:

#include <bits/stdc++.h>
using namespace std;int n, W;
int w[11111], v[11111];
int dp[11111][11111];int rec(int i, int j) {if(dp[i][j] >= 0)return dp[i][j];int res;if(i == n)res = 0;else if(j < w[i])res = rec(i + 1, j);elseres = max(rec(i + 1, j), rec(i + 1, j - w[i]) + v[i]);return dp[i][j] = res;
}void solve() {memset(dp, -1, sizeof(dp));printf("%d\n", rec(0, W));
}int main() {scanf("%d%d", &n, &W);for(int i = 0; i < n; i ++)scanf("%d%d", &w[i], &v[i]);solve();return 0;
}

解法3:

dfs

时间复杂度:$O(2^n)$

代码:

#include <bits/stdc++.h>
using namespace std;int n, W;
int w[11111], v[11111];int dfs(int i, int j, int sum) {int res;if(i == n)res = sum;else if(j < w[i])res = dfs(i + 1, j, sum);elseres = max(dfs(i + 1, j, sum), dfs(i + 1, j - w[i], sum + v[i]));return res;
}int main() {scanf("%d%d", &n, &W);for(int i = 0; i < n; i ++)scanf("%d%d", &w[i], &v[i]);int num = dfs(0, W, 0);printf("%d\n", num);return 0;
}

解法4:

动态规划 不写递归函数,直接用递推式把各项的值计算出来(如果多组输入 $dp$ 需要初始化)

时间复杂度:$O(n * W)$

代码1:

#include <bits/stdc++.h>
using namespace std;int n, W;
int w[11111], v[11111];
int dp[11111][11111];void solve() {for(int i = n - 1; i >= 0; i --) {for(int j = 0; j <= W; j ++) {if(j < w[i])dp[i][j] = dp[i + 1][j];elsedp[i][j] = max(dp[i + 1][j], dp[i + 1][j - w[i]] + v[i]);}}printf("%d\n", dp[0][W]);
}int main() {scanf("%d%d", &n, &W);for(int i = 0; i < n; i ++)scanf("%d%d", &w[i], &v[i]);solve();return 0;
}

 代码2:

#include <bits/stdc++.h>
using namespace std;int n, W;
int w[11111], v[11111];
int dp[11111][11111];void solve() {for(int i = 0; i < n; i ++) {for(int j = 0; j <= W; j ++) {if(j < w[i])dp[i + 1][j] = dp[i][j];elsedp[i + 1][j] = max(dp[i][j], dp[i][j - w[i]] + v[i]);}}printf("%d\n", dp[n][W]);
}int main() {scanf("%d%d", &n, &W);for(int i = 0; i < n; i ++)scanf("%d%d", &w[i], &v[i]);solve();return 0;
}

 代码3:

#include <bits/stdc++.h>
using namespace std;int n, W;
int w[11111], v[11111];
int dp[11111][11111];void solve() {for(int i = 0; i < n; i ++) {for(int j = 0; j <= W; j ++) {dp[i + 1][j] = max(dp[i][j], dp[i + 1][j]);if(j + w[i] <= W)dp[i + 1][j + w[i]] = max(dp[i + 1][j + w[i]], dp[i][j] + v[i]);}}printf("%d\n", dp[n][W]);
}int main() {scanf("%d%d", &n, &W);for(int i = 0; i < n; i ++)scanf("%d%d", &w[i], &v[i]);solve();return 0;
}

  

转载于:https://www.cnblogs.com/zlrrrr/p/9562981.html

动态规划--背包问题相关推荐

  1. 贪婪算法、递归计算、动态规划背包问题

    //贪婪算法计算背包问题public static double ksack(double[] values, double[] weights, int capacity){double load ...

  2. 动态规划——背包问题(01背包问题)

    动态规划--背包问题(01背包问题) 01背包问题(求最大价值): 问题优化 01背包问题(求方案数): 动态规划--背包问题(01背包问题) 01背包问题(求最大价值): 有N件物品和一个最多能背重 ...

  3. 动态规划背包问题优化空间复杂度——滚动数组

    动态规划背包问题优化空间复杂度--滚动数组 背包问题 空间复杂度优化 Java代码 链接:代码随想录背包问题 背包问题   背包问题是动态规划中基本的问题,我们考虑下面的简单问题:   假设背包容量为 ...

  4. 动态规划——背包问题(详解)

    动态规划是我最早接触的算法,一开始非常简单,固定模板题,后来愈发愈发难起来了,条件,状态压缩等等,难点主要是,状态怎么表示,状态转移方程怎么写,这篇文章将会从背包五大问题详解,希望能帮助到大家去类比, ...

  5. 动态规划——背包问题

    动态规划--背包问题 对于背包问题,今天我们先讲解,01背包,完全背包,和多重背包.我主要从: 什么题可以用背包问题解决 背包问题的模板细节,如何准确写出背包. 1.什么题可以用背包问题解决 看到题目 ...

  6. 动态规划背包问题详解(二)---0-1背包问题

    /**  * 对于技术面试,你还在死记硬背么?  * 快来"播"沙糖橘吧,  * 用视频案例为你实战解读技术难点  * 聚焦Java技术疑难点,实战视频为你答疑解惑  * 越&qu ...

  7. 【入门级】Java解决动态规划背包问题

    目录 前言 动态规划背包问题是什么? 动态规划解题转代码 第一步:拆包填表格 第二步:转为代码 一.首先看空表格:即初始化代码 二.看怎么循环填表格 三.输出结果(最大价值) 第三步:完整代码 动态规 ...

  8. Java-算法-动态规划-背包问题

    看完本篇文章可以再多练习相似题目 算法-动态规划-背包问题-附一 ​​​​​​​ 一. 背包问题介绍 1. 最原始的背包问题 给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择 ...

  9. 动态规划---背包问题分析

    0/1背包 问题描述 有N件物品和一个容量为V的背包,第i件物品的体积为c[i],价值为w[i].求将哪些物品放进背包可以使物品价值总和最大(有两种情况:不要求填满背包和填满背包). 每件商品只有一件 ...

  10. 动态规划 —— 背包问题 P09 —— 背包问题的变化

    [输出方案] 一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案,可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪 ...

最新文章

  1. 第十六届全国大学生智能汽车竞赛总决赛 AI视觉组线上赛细则
  2. 算法----打印二叉树最右侧的节点 Java版
  3. dabs是什么意思_单词flounder是什么中文意思
  4. php mysql修改命令_PHP编程:mysql alter table命令修改表结构实例详解
  5. Android在线更新安装包,Android在线更新下载方案
  6. php implode key,PHP Implode关联数组
  7. 配置csrf_django 入门第一课 配置文件
  8. 【物理】概念的理解 —— Phase(相位)
  9. 2.企业安全建设指南(金融行业安全架构与技术实践) --- 金融行业的信息安全
  10. 简单了解一下如何使用Spring框架里JDBC和事务
  11. java诸神47723_诸神战纪二-死神之谜
  12. python utf 8 mac_Mac python 开发环境一些设置
  13. 艺术论文题目汇总大全
  14. Qt简述如何实现不规则按钮
  15. ECharts series动态加载 可执行方案
  16. 基于FPGA的GV7600驱动
  17. 为什么硬盘插在计算机上不显示,硬盘插在电脑上不显示怎么办
  18. Google Play 开发者账户已被终止的通知
  19. augment()图像增强库
  20. C++ 判断文件文件夹是否存在

热门文章

  1. 零基础带你飞web前端教程带你探究web前端趋势
  2. Hive | 加载数据后,出现字段显示为 NULL的问题
  3. js click 与 onclick 事件绑定,触发与解绑
  4. 遍历Linux kernel的链表时删除元素的方法
  5. Linux写时拷贝技术(copy-on-write)
  6. 《剑指offer》求二叉树的最小深度(非递归法)
  7. 把远程仓库的项目,clone到eclipse里面
  8. 如何计算Java对象所占内存的大小
  9. 一次DeleteInsert引发的Mysql死锁
  10. ElasticSearch 使用Java Api访问集群