963 AlvinZH打怪刷经验(背包DP大作战R)
963 AlvinZH打怪刷经验
思路
这不是一道普通的01背包题。大家仔细观察数据的范围,可以发现如果按常理来的话,背包容量特别大,你也会TLE。
方法一:考虑01背包的一个常数优化----作用甚微。考虑到V很大时,由于只需要dp[V]的值,倒推前一个物品,只要知道dp[V-Wn]即可。以此类推,对以第j个背包,其实只需要知道到dp[V-sum{w[j..n]}]即可。这是DP无后效性的理解。
什么是01背包常数优化?
这种方法可以卡着时间点过这题,具体参考参考代码一。
方法二:动态规划需要变通!!!发现价值之和的最大值只有10^5,逆向思维,容量与价值概念互换,用最大价值来求最小容量;即,把价值之和看作是背包容量,转化为求最大价值对应的最小容量进行背包。
效率很高,不是上一种方法能比的,毕竟差了好几个数量级。具体参考参考代码二。
参考代码一
//
// Created by AlvinZH on 2017/11/16.
// Copyright (c) AlvinZH. All rights reserved.
//
#include <cstdio>
#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int n, m, sum;
int Weight[102];//体积
int Value[102];//价值
int dp[100005];
int main()
{
while(~scanf("%d %d", &n, &m))
{
int wSum = 0, vSum = 0;
memset(dp, INF, sizeof(dp));
for (int i = 0; i < n; ++i) {
scanf("%d %d", &Weight[i], &Value[i]);
wSum += Weight[i];
vSum += Value[i];
}
dp[vSum] = wSum;
for (int i = 0; i < n; ++i) {
for (int j = Value[i]; j <= vSum; ++j) {
if(dp[j] - Weight[i] >= 0)
dp[j - Value[i]] = min(dp[j-Value[i]], dp[j]-Weight[i]);
}
}
for (int i = vSum; i >= 0; --i) {
if(dp[i] <= m) {
printf("%d\n", i);
break;
}
}
}
}
参考代码二
//
// Created by AlvinZH on 2017/11/16.
// Copyright (c) AlvinZH. All rights reserved.
//
#include <cstdio>
#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int n, m, sum;
int Weight[102];//体积
int Value[102];//价值
int dp[100005];
int main()
{
while(~scanf("%d %d", &n, &m))
{
int wSum = 0, vSum = 0;
memset(dp, INF, sizeof(dp));
for (int i = 0; i < n; ++i) {
scanf("%d %d", &Weight[i], &Value[i]);
wSum += Weight[i];
vSum += Value[i];
}
dp[0] = 0;
dp[vSum] = wSum;
for (int i = 0; i < n; ++i) {
for (int j = vSum; j >= Value[i]; --j) {
if(dp[j] > dp[j-Value[i]] + Weight[i])
dp[j] = dp[j-Value[i]] + Weight[i];
}
}
for (int i = vSum; i >= 0; --i) {
if(dp[i] <= m) {
printf("%d\n", i);
break;
}
}
}
}
963 AlvinZH打怪刷经验(背包DP大作战R)的更多相关文章
- AlvinZH掉坑系列讲解(背包DP大作战H~M)
本文由AlvinZH所写,欢迎学习引用,如有错误或更优化方法,欢迎讨论,联系方式QQ:1329284394. 前言 动态规划(Dynamic Programming),是一个神奇的东西.DP只能意会, ...
- 976 AlvinZH想回家(背包DP大作战T)
976 AlvinZH想回家 思路 如果在第i小时有一些飞机延误,那么一架飞机的c值越大,这一小时产生的损失也越大.而使这一小时产生的损失尽可能的小并不会导致接下来时间产生的损失增大.因此应当每一小时 ...
- 977 AlvinZH过生日(背包DP大作战S)
977 AlvinZH过生日 思路 难题.逆推DP. 要明确dp的状态只与是否有选择权有关,而与选择权在谁手里无关.因为不论选择权在谁手里,那个人都会尽可能的获得最大的蛋糕重量. dp[i]表示分配到 ...
- 991 AlvinZH的奇幻猜想----整数乘积plus(背包DP大作战P)
914 AlvinZH的奇幻猜想----整数乘积puls 思路 难题.动态规划. 将数字串按字符串输入,处理起来更方便些. dp[i][j]:表示str[0~i]中插入j个乘号时的乘积最大值.状态转移 ...
- 906 AlvinZH的奇幻猜想----整数乘积(背包DP大作战O)
906 AlvinZH的奇幻猜想----整数乘积 思路 难题.动态规划. 将数字串按字符串输入,处理起来更方便些. dp[i][j]:表示str[0~i]中插入j个乘号时的乘积最大值.状态转移方程为: ...
- 851 AlvinZH的鬼畜密码(背包DP大作战N)
851 AlvinZH的鬼畜密码 思路 难题.动态规划. 先判断字符串是否合理(可翻译),然后分段处理,每一小段用动态规划求出解法数. dp[i]:字符串str[0~i]的解法数.通过判断str[i] ...
- DP大作战—组合背包
题目描述 组合背包:有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包). DD大牛的伪代码 for i = 1 to N if 第i件物品属 ...
- DP大作战——多重背包
题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可 ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
随机推荐
- 回文链表 · Palindrome Linked List
[抄题]: 设计一种方式检查一个链表是否为回文链表.1->2->1 就是一个回文链表. [暴力解法]: 时间分析: 空间分析: [思维问题]: 以为要从从后往前扫描,不知道调用revers ...
- Bash空格的那点事-乾颐堂CCIE
先了解下bash中什么时候该用空格,什么时候不该用. 1. 等号赋值两边不能有空格 2. 命令与选项之间需要空格 3. 管道两边空格可有可无 我们来看看常见的问题 1. 赋值时等号两边或者只有左边多了 ...
- 向对象(OO)程序设计
http://www.uml.org.cn/mxdx/201208232.asp 前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented ...
- C# 实现对PPT编辑
C# Presentation 文本替换 我们可以通过插入占位符的方式,使用新的字词替换已有幻灯片里的文字. 本文将详细描述如何使用Spire.Presentation 来替换Prsentation ...
- Eclipse快捷键和练习题(倒叙,排序)
1 快捷键 内容辅助键 Alt+/ 自动补齐main方法 main 然后 Alt+/ 自动补齐输出语句 syso 然后 Alt+/ 格式化Ctrl+Shift+f 代码区域右键 -- So ...
- WSAStartup函数
函数WSAStartup 一.WSAStartup函数 int WSAStartup ( ...
- ssh关于含有外键的传值中无法识别正确的action的原因和解决办法
在含有外键的表中,要保存一个值到这个外键时:逻辑思路:需要先将jsp页面的值传到相应的action中,在这个action中需要引入这个外键的实体层和DAO层(DAO层只需set方法),在执行函数中对于 ...
- 团体程序设计天梯赛L1-027 出租 2017-03-23 23:16 40人阅读 评论(0) 收藏
L1-027. 出租 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声, ...
- 20145233《网络对抗》Exp6 信息收集和漏洞扫描
20145233<网络对抗>Exp6 信息收集和漏洞扫描 实验问题思考 哪些组织负责DNS,IP的管理 全球根服务器均由美国政府授权的ICANN统一管理,负责DNS和IP地址管理.全球一共 ...
- uwsgi启动提示:probably another instance of uWSGI is running on the same address (:8002). bind(): Address already in use [core/socket.c line 769]
提示8002端口被占用,可以这样终止掉后再启动 sudo fuser -k 8002/tcp