acwing12

直接上题解,后面写有一般的对于方案没有限制的题解。若不懂如何求出最优解的具体方案,可以先看最下面的一般题解。

字典序最小的方案

状态表示: d p [ i ] [ j ] 表 示 第 i 个 物 品 到 第 n 个 物 品 体 积 为 j 时 的 最 优 解 dp[i][j]表示第i个物品到第n个物品体积为j时的最优解 dp[i][j]表示第i个物品到第n个物品体积为j时的最优解
因此状态转移方程变为:
d p [ i ] [ j ] = { d p [ i + 1 ] [ j ] j < v [ i ] m a x ( d p [ i + 1 ] [ j ] , d p [ i + 1 ] [ j − v [ i ] ] + w [ i ] ) e l s e dp[i][j] = \begin{cases} dp[i + 1][j] & {j < v[i]}\\max(dp[i + 1][j], dp[i + 1][j - v[i]] + w[i]) & {else}\end{cases} dp[i][j]={dp[i+1][j]max(dp[i+1][j],dp[i+1][j−v[i]]+w[i])​j<v[i]else​
思路:
因为可能有多个最优解,且要求字典序最小的最优解,所以要从第一个物品开始判断,且if的判断条件只能是j >= v[i] && dp[i][j] == dp[i + 1][j - v[i]] + w[i]
若采用dp[i][j] > dp[i + 1][j]则会出错。
例如:
4 5
1 2
2 4
3 4
4 6
2 4 6 6 8
0 4 4 6 8
0 0 4 6 6
0 0 0 6 6
2 3(答案)

int dp[1003][1003];
int f[1003];
int w[N], v[N];int main()
{IOS;int n, m; cin >> n >> m;for (int i = 1; i <= n; i++)cin >> v[i] >> w[i];for (int i = n; i >= 1; i--)for (int j = 1; j <= m; j++){dp[i][j] = dp[i + 1][j];if (j >= v[i])dp[i][j] = max(dp[i][j], dp[i + 1][j - v[i]] + w[i]);}for (int j = m, i = 1; i <= n; i++){//注意数组越界if (j >= v[i] && dp[i][j] == dp[i + 1][j - v[i]] + w[i])f[i] = 1, j -= v[i];}for (int i = 1; i <= n; i++)if (f[i]) cout << i << " ";return 0;
}

以下是一般的只需要求出具体方案的题解

思路

一般的求具体方案为正序对n个物品进行状态转移。
状态转移方程:
d p [ i ] [ j ] = { d p [ i − 1 ] [ j ] j < v [ i ] m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − v [ i ] ] + w [ i ] ) e l s e dp[i][j] = \begin{cases} dp[i - 1][j] & {j < v[i]}\\max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i]) & {else}\end{cases} dp[i][j]={dp[i−1][j]max(dp[i−1][j],dp[i−1][j−v[i]]+w[i])​j<v[i]else​



代码
if的判断条件可以是 d p [ i ] [ j ] > d p [ i − 1 ] [ j ] dp[i][j] > dp[i - 1][j] dp[i][j]>dp[i−1][j]也可以是 j > = v [ i ] a n d d p [ i ] [ j ] = = d p [ i − 1 ] [ j − v [ i ] ] + w [ i ] j >= v[i] ~~and~~ dp[i][j] == dp[i - 1][j - v[i]] + w[i] j>=v[i]  and  dp[i][j]==dp[i−1][j−v[i]]+w[i]
两者的区别:
假如 d p [ n ] [ m ] = d p [ n − 1 ] [ m ] > d p [ n − 2 ] [ m ] dp[n][m] = dp[n - 1][m] > dp[n - 2][m] dp[n][m]=dp[n−1][m]>dp[n−2][m]。由于是倒序循环的,前者会将 n − 1 n - 1 n−1 标记为答案,而后者可能会将n标记为答案。
例如:(条件为前者时跑的样例)
4 5
1 2
2 4
3 4
4 6(样例)
2 2 2 2 2
2 4 6 6 6
2 4 6 6 8
2 4 6 6 8(dp数组)
2 3(方案)
(第二个if条件跑出来的方案则是1,4)

for (int j = m, i = n; i >= 1; i--){if (dp[i][j] > dp[i - 1][j])f[i] = 1, j -= v[i];else f[i] = 0;}

注意:使用第二个if条件虽然可以过上面的样例,但是求最优方案最小的字典序仍然时不对的。

一般求具体方案

int dp[1003][1003];
int f[1003];
int w[N], v[N];int main()
{IOS;int n, m; cin >> n >> m;for (int i = 1; i <= n; i++)cin >> v[i] >> w[i];for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){dp[i][j] = dp[i - 1][j];if (j >= v[i])dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i]] + w[i]);}for (int j = m, i = n; i >= 1; i--){if (j >= v[i] && dp[i][j] == dp[i - 1][j - v[i]] + w[i])f[i] = 1, j -= v[i];else f[i] = 0;}for (int i = 1; i <= n; i++)if (f[i]) cout << i << " ";return 0;
}

01背包(求具体方案的最小字典序)相关推荐

  1. [01背包] 背包问题求具体方案(01背包+求方案数+思维)

    文章目录 0. 前言 1. 01背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包+求方案数+思维 12. 背包问题求具体方案 求方案数也是背包问题.dp 的 ...

  2. [01背包] 数字组合(01背包+求方案数)

    文章目录 0. 前言 1. 01背包求方案数 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包求方案数 278. 数字组合 将 M 看作背包容量,每个数看成一个物品,Ai 看成是 ...

  3. 完全背包问题完全背包求具体方案

    这个博客想带大家通透的了解完全背包(我早就学完了) 完全背包是什么 相较于 01 背包,完全背包就是每个物品的数量有无数个,而 01 背包则是每个物品只能选一个. 怎么解决 我们定义 f [ i ] ...

  4. HDU 2639(01背包求第K大值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2639 Bone Collector II Time Limit: 5000/2000 MS (Jav ...

  5. 物资调度(01背包+求方案数)

    物资调度 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70 ...

  6. 【01背包求方案数模板】洛谷 P1164 小A点菜

    洛谷 P1164 小A点菜 https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆, ...

  7. 12 背包问题求具体方案(零一背包问题求具体方案)

    1. 问题描述: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次.第 i 件物品的体积是 vi,价值是 wi.求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输 ...

  8. HDU2639 01背包 第K优决策

    初学背包.以下内容,来源网络,整理以作学习资料. 求第K优解 对于求次优解.第K优解类的问题,如果相应的最优解问题能写出状态转移方程.用动态规划解决,那么求次优解往往可以相同的复杂度解决,第K优解则比 ...

  9. 新年趣事之打牌【01背包】【输出方案】

    01背包求方案数 + 输出方案 #include<iostream> #include <algorithm> #include <string.h> using ...

最新文章

  1. Django的model.py
  2. go mysql 乱码_MySQL 乱码之我见
  3. Py之pyglet:Python之pyglet库的简介、安装、使用详细攻略
  4. 4 在vCenter Server安装View Composer组件
  5. python教程怎么读_python怎么读本地文件
  6. WebAPI(part4)--操作元素
  7. vert.x_选择Vert.x的3个理由
  8. linux下查看CPU、内存、磁盘信息
  9. 数据库新手常犯的5个错误
  10. 使用struct与typedef定义结构体
  11. web渗透测试中WAF绕过讲解(二)基于HTTP协议绕过
  12. postman支持socket吗_如何使用postman测试接口webservice?
  13. WMS仓库管理软件操作流程是怎样
  14. 三年探索:一条自控、电信/科类学生的技术成长路线
  15. Marlin固件串口功能解析和程序移植
  16. 水星路由器登录界面找不到服务器,新版水星(Mercurey)路由器后台登陆界面打不开解决方法...
  17. [NOIP模拟16]题解
  18. pnpm安装使用教程以及pnpm node版本管理以及EPERM operation not permitted symlink问题解决
  19. 全球与中国线路型避雷器市场发展前景与投资战略规划分析报告2022~2028年
  20. GICv3软件overview手册之GICv4对虚拟LPI的直接注入(1)

热门文章

  1. nuxt.js项目使用pm2部署时遇到的问题及解决方案更新
  2. 英伟达专业测试软件,测试软件平台环境一览_NVIDIA GeForce GTX 980Ti_显卡评测-中关村在线...
  3. 赋能动力电池智能制造,推进锂电产线质与量的提升
  4. VS2015项目部署到服务器,VS 2015使用Web Deploy发布Web 应用
  5. ROS2机器人激光雷达测距的C++代码
  6. 四川大学锦城学院计算机系2013届李乔,四川大学锦城学院2019年度“翻转课堂”教学技能大赛圆满举行...
  7. 写在5G边缘:2B本质是2C
  8. ofo html源码,Github最火开源项目-一行代码实现ofo小黄车的引导界面
  9. Selenium之模拟登录铁路12306
  10. kali linux 网络架构,Kali Linux网络扫描教程大学霸内部资料