#1038 : 01背包

时间限制:20000ms

单点时限:1000ms

内存限制:256MB

描述

且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了!

小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值。现在他想知道,凭借他手上的这些奖券,可以换到哪些奖品,使得这些奖品的喜好值之和能够最大。

提示一:合理抽象问题、定义状态是动态规划最关键的一步

提示二:说过了减少时间消耗,我们再来看看如何减少空间消耗

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为两个正整数N和M,表示奖品的个数,以及小Ho手中的奖券数。

接下来的n行描述每一行描述一个奖品,其中第i行为两个整数need(i)和value(i),意义如前文所述。

测试数据保证

对于100%的数据,N的值不超过500,M的值不超过10^5

对于100%的数据,need(i)不超过2*10^5, value(i)不超过10^3

输出

对于每组测试数据,输出一个整数Ans,表示小Ho可以获得的总喜好值。

样例输入

5 1000
144 990
487 436
210 673
567 58
1056 897

样例输出

2099

题解:01背包模板题,所求的是n种商品、m张奖券能兑换的最大价值,可以转化为遍历i种奖品奖券数为j时获取的最大值(dp[i][j]),然后取max( i奖品的价值+剩下奖券能获取的最大价值 ,原来奖券数为j时的最大价值)为奖券数为j时获取的最大值(原理就是比较使用同样多的奖券加入i奖品组合后是否能产生更大价值),dp[i][j]=max(dp[i-1][j],dp[i-1][j-need[i]]+val[i]),为了减小复杂度,我们可以将dp变成一维数组,只记录奖券数为j时当前最大价值,从表上可以发现,每次增加奖品dp数据更新判断时只使用上一行中小于等于j的数据,所以采取从后往前遍历的方法避免数据使用冲突,同时我们可以一边输入一边更新,不用储存各种奖品对应的奖券数和价值,dp[j]=max(dp[j],dp[j-need+val);(dp漫画讲解:https://www.jianshu.com/p/e200805306db

//一般解法  时间:2625ms	内存:202MB
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int dp[505][100011];
int need[505],val[505];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d %d",&need[i],&val[i]);
memset(dp,0,sizeof(dp));
//dp[i][j]就是奖券数为j时遍历i种产品的最大价值
for(int i=1;i<=n;i++){//第i件奖品
for(int j=1;j<=m;j++){//消耗的奖券数
if(!i){//小于need[i]时该奖品不产生影响
if(j>=need[i])
dp[i][j]=val[i];
}else{
if(j>=need[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-need[i]]+val[i]);
//dp[i-1][j-need[i]]表示减去i奖品所需奖券数能取得的最大价值(在上一奖品中已经求出)
//若i奖品的价值+剩下奖券能获取的最大价值>原来奖券数为j时的最大价值,则更新奖券数为j时的最大价值
else//小于need[i]时该奖品不产生影响
dp[i][j]=dp[i-1][j];
}
}
}
printf("%d\n",dp[n][m]);
return 0;
}
//优化解法  时间:143ms	内存:0MB
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int dp[100011];
int main()
{
int n,m,need,val;
scanf("%d %d",&n,&m);
memset(dp,0,sizeof(dp));
//dp[j]就是奖券数为j当前最大价值
for(int i=1;i<=n;i++){//第i件奖品
scanf("%d %d",&need,&val);
for(int j=m;j>=need;j--)
dp[j]=max(dp[j],dp[j-need]+val);
}
printf("%d\n",dp[m]);
return 0;
}

HihoCoder - 1038 01背包 动态规划的更多相关文章

  1. hihoCoder #1038 : 01背包(板子题)

    #1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...

  2. hihocoder 1038 01背包

    #1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...

  3. hiho #1038 : 01背包 (dp)

    #1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...

  4. hihoCoder week6 01背包

    01背包 题目链接 https://hihocoder.com/contest/hiho6/problem/1 #include <bits/stdc++.h> using namespa ...

  5. C++ 实现01背包动态规划

    简述一下01背包: 背包容量大小固定,有一些物品,每个物品都有重量和价值两个属性,且物品唯一不重复(即同一物品只能放入一个),放入物品的总重量不能超过背包容量 ,求放入背包的物品的总价值最大化.0代表 ...

  6. 【hihocoder】01背包

    描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要ne ...

  7. 【HIHOCODER 1038】 01背包

    链接 问题描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖 ...

  8. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  9. [C++] 动态规划之矩阵连乘、最长公共子序列、最大子段和、最长单调递增子序列、0-1背包

    一.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 将待求解问题分解成若干个子问题,先求解子 ...

随机推荐

  1. Centos 6.5下mysql 8.0.11的rpm包的安装方式

    1.系统版本及mysql下载地址 操作系统:Centos 6.5(Centos 7.4下载对应的mysql版本安装同理) mysql数据库版本:mysql8.0.11 mysql官方网站:http:/ ...

  2. LOJ 6281 数列分块入门 5

    简化版题意 给出一个长为n的数列,以及n个操作,操作涉及区间开方(每个数都向下取整),区间求和,保证所有数都为有符号32位正整数. N<=50000 Solution 首先我们先思考: 一个有符 ...

  3. redis实现分页

    redis实现分页功能,主要是将数据缓存起来,无需频繁查询数据库,减少数据库的压力. 适用场景:单用户操作列表界面分页,如博客列表. 缺点:不可模糊查询,缺少灵活性. 封装类: class XgRed ...

  4. MongoDB用户权限认证

    关于用户的认证及权限 用户是跟着库创建的,在哪个库创建的什么权限的什么用户,只对此库有相应权限(除超级管理员以外). 官网文档:https://docs.mongodb.com/master/refe ...

  5. [Reinforcement Learning] Model-Free Prediction

    上篇文章介绍了 Model-based 的通用方法--动态规划,本文内容介绍 Model-Free 情况下 Prediction 问题,即 "Estimate the value funct ...

  6. 使用以太网通信方式刷新AB PLC固件

    本文详细介绍如何使用以太网通信方式刷新AB PLC固件 一.准备工作 1.  AB PLC控制器一台,本文以5069-L330ER为例,将其通电: 2.  5069-L330ER的IP已设置为172. ...

  7. Python核心编程(网络编程)

    1.python socket模块内置方法 2.tcp服务器伪代码 3.tcp客户端伪代码 4.socket模块属性 5.一个简单的tcp客户端和服务端 服务端代码: # encoding:utf-8 ...

  8. mvc RedirectToAction、mobile 重定向地址栏未改变

    @using (Html.BeginForm("actionName", "controllerName", FormMethod.Post, new { da ...

  9. Spring AOP获取方法的参数名称和参数值

    aop配置: <aop:aspectj-autoproxy expose-proxy="true" /> @Before(value = "execution ...

  10. [转]ANR问题分析指南

    引言 每天收到无数的兄弟团队的同事向系统转ANR JIRA,有些一旦遇到App ANR就直接转到系统组,有些简单看一下就转到系统组帮忙看一下.如此浩瀚的JIRA,我们什么事不做也处理不过来,请每个Ap ...