hrbust 1558 小背包(简单01背包)水坑
小背包
Time Limit: 1000 MS Memory Limit: 10240 K
Total Submit: 1220(237 users) Total Accepted: 307(208 users) Rating: Special Judge: No
Description
有一个容量为m(1<=m<=4000000)的背包,有n(1<=n<=16)个物品,每个物品有体积v(1<=v<=2012)和价值w(0<=2012),现在要你选择一些物品,使得背包所装物品的总价值最大。
Input
有多组测试数据,但是不会超过10组。
对于每组测试数据,第一行是两个整数m和n,表示背包容量的和物品个数。接下来有n行,每行有两个整数,表示一个物品的体积和价值。
输入到文件结束。
Output
对于每组测试数据,输出一行,包含一个整数,为背包能装下物品的最大价值。
Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10
3
过程都只是一个普通的小背包,注意坑点在最大容积,第一眼看,可能觉得一定会超时爆内存,结果再往后面看发现只有16个物品,再往后看,每个物品最大只有2012,也就是说总重不会超过16*2012,背包容积最大值远大于物品体积,此时,dp数组只用设到33000左右就好,但为防止m过大,毕竟是要这个数据带入进去遍历dp数组的,所以即使没装那么多,也会遍历数组遍历到爆,RE就不可避免了。于是多加个判定条件,当容积远远大于所有物品体积时,直接全部装进去就好了,不用再执行后面的算法。这样也是有道理的,毕竟你数组就是最大体积了,容积再大,也是都可以装进去的了,不仅省时还能避免数组越界
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[20][34000];///好坑啊,题目说了背包那么大,但是实际16个物品每个物品2012的体积,根本用不了那么大
struct box
{int cost;int value;
}num[20];
int main()
{int i,j,n,m;while(scanf("%d%d",&m,&n)!=EOF){int sum=0,sum2=0;memset(dp,0,sizeof(dp));for(i=1;i<=n;i++){scanf("%d%d",&num[i].cost,&num[i].value);sum=sum+num[i].cost;sum2=sum2+num[i].value;}if(sum<m)///注意自己输入的是m,即使合在一起的体积没那么大,容积还是会在遍历时用到m的数值,而发生数组越界,因此注意{printf("%d\n",sum2);///当输入的容积大于总体积时,可以直接输出所有的价值和,不用一个一个装上去了continue;}for(i=num[1].cost;i<=m;i++){dp[1][i]=num[1].value;}for(i=2;i<=n;i++){for(j=1;j<=m;j++){if(j>=num[i].cost){dp[i][j]=max(dp[i-1][j],dp[i-1][j-num[i].cost]+num[i].value);///记住啊,容积减掉当前遍历的那个物品的体积,个数也要减掉一个诶}elsedp[i][j]=dp[i-1][j];///是物品-1,不是容积-1,是如果装不了,那就继承上面那个物品的在此容积下的价值!!!}}
// for(i=0;i<=n;i++)///动态规划表超美的
// {// for(j=0;j<=m;j++)
// {// printf(" %d",dp[i][j]);
// }
// printf("\n");
// }printf("%d\n",dp[n][m]);}return 0;
}
hrbust 1558 小背包(简单01背包)水坑相关推荐
- HDU2602Bone Collector 简单0-1背包
HDU2602Bone Collector 简单0-1背包 Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 习题整理(简单01背包 可用查并集2022/4/24)
习题整理 提示:之前的习题在习题集合 文章目录 习题整理 一.诱人的宝藏 1.思路 2.代码 二.晚宴 1.思路 2.代码 三.医师之路 1.思路 2.扩展知识 3.代码 总结 提示:以下是本篇文章正 ...
- hdu 1881(简单01背包)
毕业bg Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
- 简单01背包 POJ3211 Washing Clothes 多种衣服分别dp
题目连接:http://poj.org/problem?id=3211 大意就是 一个人洗衣服,然后找他媳妇帮忙.有n种颜色的衣服,和m件衣服,每件衣服的颜色和洗出来的时间都会给出来.再洗的时候两个人 ...
- hdu1171 转化01背包,组合
题意就是给你一些有价值的物品,你要把它分成尽量相同的两份. #include <iostream> #include <cstring> #include <algori ...
- 01背包总结+传授个人经验
写在前面: 自从学了背包这个专题,感觉永远也写不完,之前写了三种类型的01背包,结果现在发现都是简单的01背包.后来又学了多重背包.完全背包,其中多重背包还可以进行二进制优化. 本文将对这几种常见的背 ...
- DP问题之01背包如此简单
01背包问题 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大. ...
- hdu 2546 饭卡——一道简单的 01背包
今天讲的是动态规划,学长们拉了13道题让我们做一下,一下午大概4小时,做了5道题(还是太弱了 摊手) 题意: 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上 ...
- 简单的01背包和完全背包
2020.12.30开始学习AcWing算法<算法竞赛进阶指南>: 上传博客方便复习. 01背包(每种物品只能使用一次): //Wecccccccc //2020.12.31 #inclu ...
最新文章
- java数组是不是对象_java的数组是对象吗
- linux无法运行病毒,{转}为什么linux系统不容易中病毒?
- Angular.js 最强学习资源合集
- 大咖说中台 | 建设数据中台系列(五)——中台架构详解(下)
- Oracle Golden Gate 系列十二 -- GG 数据初始化装载二 基于SCN 的初始化 说明 与 示例...
- Kaldi语料的两种切分/组织方式及其处理
- matlab 图例自定义,matlab实现自定义曲线图以及图例
- linux五笔输入法制作_在linux下制作拼音五笔输入法
- 北京16个山水美景| 清明小长假走起吧!
- Eclipse:Build not configured correctly问题
- Gephi报错cannot load even default layout, using internally predefined configuration解决方法
- 教孩子学习乘法和除法,我算是绞尽脑汁了
- Java Ftp客户端
- VS2022配置OpenCV 4.3.0报错解决办法
- 2秒下一部4K电影 挥别蹭网下片时代
- Unable to load Maven meta-data from xxx com/github/chrisbanes/photoview/
- vue适配双端浮标(悬浮球)拖拽
- 产品体验报告——百词斩
- Python ChatOps库:Opsdroid和Errbot
- vue 前端实现对pdf添加批注