(闫氏dp分析法)AcWing 2. 01背包问题

简介: (闫氏dp分析法)AcWing 2. 01背包问题

题目链接

2. 01背包问题 - AcWing题库

一些话

切入点

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出最大价值。

0<N,V≤1000

0<vi,wi≤1000

1.求解某种符合题意的方案,而且是要最优方案,符合dp特征

2.数据范围在1e3内,属于dp的范畴


流程

闫氏dp分析法


分析问题分为状态表示和状态计算两部分


1.状态表示,思考用1维还是2维来储存数据,此题有物品,空间和价值三种数据要储存,所以宜选用2维


          状态表示后又分为集合和属性两部分


       1.1集合:二维数组f[i][j]表示一个怎样的集合? 01背包中表示物品的选法


               考虑前i个物品的情况下,背包容积还剩j时的最优解


       1.2属性:二维数组f[i][j]储存的数据是什么属性 maxn?minn?数目?此题储存的是maxn


(状态表示部分往往是靠经验来写而不是自己想出来的)


2.状态计算:


       将集合划分成子集合,来一层一层获取


       划分的依据是:最后一个不同的节点,如此题是f[i][j]选不选i,选和不选是两种结果


       每层的选与不选可以将集合划分为两个子集,没有遗漏。(求数量时还有遵循不重复的原则)


       选i,[i-1][j-v[i]] + w[i];


       不选[i-1][j];


最后按照分析的结果枚举每一层,输出f[n][m];

套路

ac代码

// 11:01~11:08
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
// f[i][j],考虑前i件物品,背包容量j时的价值
const int N = 1e3 + 10;
int f[N][N];
int v[N],w[N];
int n,m;
int main(){
    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 = 0;j <= m;j++){
            f[i][j] = f[i-1][j];
            if(v[i] <= j){
                f[i][j] = max(f[i][j],f[i-1][j-v[i]] + w[i]);
                //在纠结这里为什么是f[i-1][j-v[i]] + w[i],
                // 会纠结的根本原因是没明白f[i][j]的含义,考虑前i件物品,背包还剩下j空间时的最优解
                // 因为能选的物品都考虑过后才可能得到一个最优解,所以只有上一层i的数值是正确的,所以只能用f[i-1]的值,不能用f[i]的值
            }
        }
    }
    cout << f[n][m] << endl;
    return 0;
}
目录
相关文章
|
开发框架 安全 前端开发
使用Ruby on Rails进行快速Web开发
【5月更文挑战第27天】Ruby on Rails是一款基于Ruby的高效Web开发框架,以其快速开发、简洁优雅和强大的社区支持著称。遵循“约定优于配置”,Rails简化了开发流程,通过MVC架构保持代码清晰。安装Ruby和Rails后,可使用命令行工具创建项目、定义模型、控制器和视图,配置路由,并运行测试。借助Gem扩展功能,优化性能和确保安全性,Rails是快速构建高质量Web应用的理想选择。
|
JavaScript 前端开发 安全
JavaScript 和 TypeScript 趋势
【6月更文挑战第1天】JavaScript 和 TypeScript 趋势
291 3
|
消息中间件 缓存 算法
社招一年半面经分享(含阿里美团头条京东滴滴)
重点放在专业技能和项目经验两块1.你的简历就是你给面试官提供的考点,简历上的东西必须自己Hold住,万一自己写的东西被问住了,会很尴尬,给面试官留下的印象也不好,所以就是会啥写啥2.技术栈最好不要写精通,你敢写面试官就敢问,被问倒了很尴尬的,写熟悉,了解就行怎么投简历我这里强烈建议找人内推,这样简历通过的概率大些,如果找不到,可以试试脉脉,我就是从脉脉投的简历,把状态改成寻找机会就行,会有很多人找你的推荐一个简历制作模版,我一直用的,https://www.polebrief.com/index算法这个该刷还是得刷,别偷懒,我个人感觉刷完下面几个已经够了,大家可以根据自己的基础情况选择剑指Of
1162 1
SpringBoot 项目启动初始化一个Map对象到内存
SpringBoot 项目启动初始化一个Map对象到内存
351 1
|
Web App开发 移动开发 前端开发
b 站, 掘金都在用的 webp 是什么?怎么用?
如果你现在用 PC 端浏览器看这篇文章,不妨打开控制台,cltr + c 一下去看下掘金图片的后缀/格式究竟是什么?
|
存储 索引 NoSQL
二叉堆与自定义优先队列实现删除任意元素
二叉堆与自定义优先队列实现删除任意元素
|
编译器
Mac下Clion编译错误:Undefined symbols for architecture x86_64
在使用CLion做LeetCode题编译时,突然出现了一下的情况: Undefined symbols for architecture x86_64: "Solution::isCommonPrefix(std:...
6658 0
|
缓存 监控 安全
Spring Boot框架基础介绍
Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具,它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序,并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到了广泛应用,本文将介绍 Spring Boot 的特性、优势以及使用方法。
3781 0
|
关系型数据库 MySQL 中间件