小背包
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背包)水坑相关推荐

  1. HDU2602Bone Collector 简单0-1背包

    HDU2602Bone Collector 简单0-1背包 Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  2. 习题整理(简单01背包 可用查并集2022/4/24)

    习题整理 提示:之前的习题在习题集合 文章目录 习题整理 一.诱人的宝藏 1.思路 2.代码 二.晚宴 1.思路 2.代码 三.医师之路 1.思路 2.扩展知识 3.代码 总结 提示:以下是本篇文章正 ...

  3. hdu 1881(简单01背包)

    毕业bg Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

  4. 简单01背包 POJ3211 Washing Clothes 多种衣服分别dp

    题目连接:http://poj.org/problem?id=3211 大意就是 一个人洗衣服,然后找他媳妇帮忙.有n种颜色的衣服,和m件衣服,每件衣服的颜色和洗出来的时间都会给出来.再洗的时候两个人 ...

  5. hdu1171 转化01背包,组合

    题意就是给你一些有价值的物品,你要把它分成尽量相同的两份. #include <iostream> #include <cstring> #include <algori ...

  6. 01背包总结+传授个人经验

    写在前面: 自从学了背包这个专题,感觉永远也写不完,之前写了三种类型的01背包,结果现在发现都是简单的01背包.后来又学了多重背包.完全背包,其中多重背包还可以进行二进制优化. 本文将对这几种常见的背 ...

  7. DP问题之01背包如此简单

    01背包问题 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大. ...

  8. hdu 2546 饭卡——一道简单的 01背包

    今天讲的是动态规划,学长们拉了13道题让我们做一下,一下午大概4小时,做了5道题(还是太弱了 摊手) 题意: 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上 ...

  9. 简单的01背包和完全背包

    2020.12.30开始学习AcWing算法<算法竞赛进阶指南>: 上传博客方便复习. 01背包(每种物品只能使用一次): //Wecccccccc //2020.12.31 #inclu ...

最新文章

  1. R语言ggplot2可视化:可视化堆叠的直方图、添加每个分组的每个bin的计数标签、在堆叠直方图的bin中的每个分组部分添加数值标签
  2. 计算机初级学哪个公需课,西安职称评审申报你遇到以下问题了吗?
  3. python编程下载安卓版-python编程狮app下载|
  4. FPGA在各行业的应用分析
  5. dataframe常用处理
  6. 【CodeForces - 215B 】Olympic Medal (数学,公式推导)
  7. 多角度分析平台即服务?PaaS的类型和用例
  8. 【一】Jmeter:体系结构
  9. Python基础——zip
  10. vmware vsphere出现“需要整合虚拟机磁盘”的告警处理方法(完整版)
  11. 对不起,我不是你爸爸
  12. 使用ssh工具连接window虚拟机中的linux系统
  13. [北航软工]第二次团队作业
  14. 我的书进驻美国 amazon.com 、 ebay.com
  15. PCb过孔大小设置 / 丝印层字符尺寸设置
  16. C语言(百钱买百鸡问题)
  17. linux md是什么格式文件,MD_ 文件扩展名: 它是什么以及如何打开它?
  18. 错误码429是什么错误?
  19. oracle锁表后,系统能否自动解锁?
  20. php readfile 图片,使用php中的readfile能否读图片

热门文章

  1. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java图书推荐系统93gei
  2. java手动注册filter,SpringBoot注册Filter的两种实现方式
  3. 雷军:技术立业 金山要向Google学习
  4. Android系国产手机操作系统汇总
  5. vue Element
  6. 阿里妈妈内容营销团队并入优酷 向樊路远汇报
  7. 摄像头拍摄运动物体,产生运动模糊/拖影的原因分析
  8. vue.js毕业设计,基于vue.js前后端分离订座预约系统(H5移动项目) 开题报告
  9. Swift 可选(Optionals)类型讲解
  10. nessus漏洞报告英文翻译中文脚本