高数Umaru系列(9)——哈士奇

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3358.html

Time Limit: 1000 ms Memory Limit: 65536 KiB
 

Problem Description

由于高数巨养的喵星人太傲娇了,要天天吃新鲜猫粮而且还经常欺负高数巨,所以高数巨决定买几条哈士奇尝尝鲜。这天高数巨来到了二手狗市场买哈士奇,高数巨看完了所有的哈士奇,记下了每条哈士奇的价格,并根据对它们的好感程度给它们每只都赋予了一个萌值。高数现在手里有X元,她想通过购买若干条哈士奇来获得尽可能多的萌值。现在给定高数巨手里的钱X以及N条哈士奇的价格和萌值,求高数巨最多可获得多少萌值

Input

多组输入。

对于每组输入,第一行有两个整数N,X(1 < = N < = 100,1 < = X < = 1000),分别表示哈士奇的数量和高数巨的钱数

接下来的N行每行有两个整数Pi,Mi(1 < = Pi,Mi < = 100),分别表示第i条哈士奇的价格和萌值

Output

对于每组数据,输出一个整数,表示高数巨最多可以获得的萌值,每组输出占一行

Sample Input

  1. 2 100
  2. 50 20
  3. 60 40
  4. 3 100
  5. 20 55
  6. 20 35
  7. 90 95
  8. 1 10
  9. 20 50

Sample Output

  1. 40
  2. 95
  3. 0

Hint

Source

Shannon

算法思路:
  这道题很明显是一个背包问题,即“在有限的背包容量下,如何选择价值总和最高的物品”。
  关于该问题有很多比较详细的解答,该算法的核心“面对一个物品i,是否要将该物品放进背包里”。
  对于理解这个算法,我们要明确:每个物品都是有重量的,会有沉默成本,放进物品i必定会承担不放进物品j的成本,所以比较的是获益和成本,当获益大于成本,那么就将这件物品放进背包里。
 
核心代码:
  1. for (int i = ; i < n; i++) { // 存储的物品个数
  2. for (int k = v; k >= w[i]; k--) { // 从所需要的重量到当前重量
  3. dp[k] = max(dp[k], dp[k - w[i]] + p[i]);
  4. }
  5. }

代码解读:

  1. 有很多人采用二维数组dp[i][j]静态地更新来解决背包问题,使用二维数组更加直观,但是不普遍。
  2. 采用一维数组动态更新看起来比较难理解,但使用范围比较广。(比如,硬币问题中,三重循环,也可以采用一维数组来解决,但如果使用二维的话,对应地应该上升到三维)
难点: "k:v->w[i],依次递减",这可能比较难以理解,在我们默认从小到大,而这里,必须从大到小,否则就是错误。
难点解答:
  我们产生上述问题,本质就是对dp[]数组在某一时间其存储的值的不理解。
  对于每一次更新开始,dp[]存储着的是“放入这个物品之前的最优解”,而我们比较的是 dp[k] 与 dp[k - w[i]] + p[i],其中 dp[k-w[i]]是之前的最优解。
  因为一定存在 k > k-w[i],如果从小到大,则一定会先与dp[k]更新dp[k-w[i]],这就会导致比较错误。此时dp[k-w[i]]已经变为"将该商品放入之后的最优价值",在这价值基础之上,在加p[i],其价值大概率会比 dp[k] 高,而更新,这样,越来越大,完全背离了我们实际的意思。
  因此,必须从后往前,因为前面存储着的是过去的值(不放第i件物品时的值)进行比较;但从小到大,该值就更新为现在的值,已经放入,但我们自认为其并没有放入,从而再放入多计算一次,这样又有什么意思呢
 
  当采用从小到大时第二轮数组的结果:
  


源代码:
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8. int n, v;
  9. int w[], p[];
  10. while (~scanf_s("%d%d", &n, &v)) {
  11. for (int i = ; i < n; i++) {
  12. // w 重量 | p 价值
  13. scanf_s("%d%d", &w[i], &p[i]);
  14. }
  15. // 清空数组
  16. int dp[] = { };
  17. for (int i = ; i < n; i++) { // 存储的物品个数
  18. for (int k = v; k >= w[i]; k--) { // 从所需要的重量到当前重量
  19. dp[k] = max(dp[k], dp[k - w[i]] + p[i]);
  20. }
  21. }
  22. printf("%d\n", dp[v]);
  23. }
  24. }
 

[动态规划]高数Umaru系列(9)——哈士奇(背包问题)的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. 期权定价公式:BS公式推导——从高数和概率论角度

    嗯,自己看了下书.做了点笔记,做了一些相关的基础知识的补充,尽力做到了详细,这样子,应该上过本科的孩子,只要有高数和概率论基础.都能看懂整个BS公式的推导和避开BS随机微分方程求解的方式的证明了.

  3. Contest 高数题 樹的點分治 樹形DP

    高数题 HJA最近在刷高数题,他遇到了这样一道高数题.这道高数题里面有一棵N个点的树,树上每个点有点权,每条边有颜色.一条路径的权值是这条路径上所有点的点权和,一条合法的路径需要满足该路径上任意相邻的 ...

  4. 高并发架构系列:MQ消息队列的12点核心原理总结

    消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 无论是 RabbitMQ.RocketMQ.Act ...

  5. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

  6. linux 服务器所支持的最大句柄数调高数倍(与服务器的内存数量相关)

    https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(详尽版).pdf 2. [推荐]调大服务器所支持的最大文件句柄数(File Descri ...

  7. 又是一年NOIP然鹅我考的是高数(虽然我没打并且内容与NOIP无关)(手动滑稽)

    好长时间没有写过总结了.也是高三结束,自招结束.成功的由国宝变为四害,整个人也是完全放松的,或者说是放肆的. 整个暑假都是游戏睡觉,游戏睡觉,也没有干什么有意义的事.有人说别人都在学习大一课程的时候我 ...

  8. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    在过去持续分享的几十期阿里Java面试题中,几乎每次都会问到Dubbo相关问题,比如:“如何从0到1设计一个Dubbo的RPC框架”,这个问题主要考察以下几个方面: 你对RPC框架的底层原理掌握程度. ...

  9. 高并发架构系列:Redis并发竞争key的解决方案详解

    https://blog.csdn.net/ChenRui_yz/article/details/85096418 https://blog.csdn.net/ChenRui_yz/article/l ...

随机推荐

  1. Atcoder C - Closed Rooms(思维+bfs)

    题目链接:http://agc014.contest.atcoder.jp/tasks/agc014_c 题意:略. 题解:第一遍bfs找到所有可以走的点并标记步数,看一下最少几步到达所有没锁的点,然 ...

  2. Python字符串中删除特定字符

    分析 在Python中,字符串是不可变的.所以无法直接删除字符串之间的特定字符. 所以想对字符串中字符进行操作的时候,需要将字符串转变为列表,列表是可变的,这样就可以实现对字符串中特定字符的操作. 1 ...

  3. 【Offer】[29] 【顺时针打印矩阵】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下矩阵:  则依次打印出数字1,2,3,4,8,12, ...

  4. java8中字符串常量以及GC相应处理机制

    目录 1,常量池 1.1, class文件常量池 1.2, 运行时常量池 1.3,字符串常量池 String.intern() -XX:StringTableSize 2,使用new关键字和使用字符串 ...

  5. apache ignite系列(四):持久化

    ignite持久化与固化内存 1.持久化的机制 ignite持久化的关键点如下: ignite持久化可防止内存溢出导致数据丢失的情况: 持久化可以定制化配置,按需持久化; 持久化能解决在大量缓存数据情 ...

  6. HMAC256 Token

    依赖包: <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</arti ...

  7. Android 本地化适配:RTL(right-to-left) 适配清单

    本文首发自公众号:承香墨影(ID:cxmyDev),欢迎关注. 一. 序 越来越多的公司 App,都开始淘金海外,寻找更多的机会.然而海外市场千差万别,无论是市场还是用户的使用习惯,都有诸多的不同. ...

  8. Java 截取字符串中指定数据及之后数据

    String resCallBackJson="12556{1{{{456858585{";        resCallBackJson = resCallBackJson.su ...

  9. 【iOS 】把一些不太重要的任务放在空时执行

    -(void)idleNotificationMethod { } -(void)registerForIdleNotification { [[NSNotificationCenter defaul ...

  10. 转载:elastic5.x部署常见问题总结

    原博文名称:ElasticSearch 5.0.0 安装部署常见错误或问题 原博文地址为:http://www.dajiangtai.com/community/18136.do?origin=csd ...