Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 39259    Accepted Submission(s): 16261

Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the maximum of the total value (this number will be less than 231).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
题意:给出n件物品的重量和价值,放进一个容量为v的背包,使背包里的价值最大。
0-1背包的模板题,可以有两种解法。
一维数组:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int  w[1100],p[1110];
int f[1110];
int main()
{int t,n,v;scanf("%d",&t);    while(t--){scanf("%d%d",&n,&v);for(int i=1;i<=n;i++)scanf("%d",&w[i]); //输入物品重量 for(int i=1;i<=n;i++)scanf("%d",&p[i]); //输入物品价值       memset(f,0,sizeof(f));for(int i=1;i<=n;i++)  {for(int j=v;j>=w[i];j--) //这个循环保证了放进去的物品重量不会超过背包所能容纳的重量
            {if(f[j] < f[j-w[i]] + p[i])  // 如果当前所拥有价值  小于 加上这件物品时创造的价值就更新 f[j]= f[j-w[i]] + p[i]; //   f[j] 表示背包重量为 j 时背包里的最大价值,//  所以f[ j - w[i] ] 表示放进这件物品时的状态(因为放进该件物品后容量就减少了)
            }}    printf("%d\n",f[v]);}        return 0;
}

二维数组:

 1  #include<stdio.h>
 2  #include<string.h>
 3  #include<algorithm>
 4  using namespace std;
 5  int w[1100],p[1110];
 6  int f[1110][1110];
 7  int main()
 8  {
 9      int t,n,v;
10      scanf("%d",&t);
11      while(t--)
12      {
13          scanf("%d%d",&n,&v);
14          for(int i=1;i<=n;i++)
15          scanf("%d",&p[i]);
16          for(int i=1;i<=n;i++)
17          scanf("%d",&w[i]);
18          memset(f,0,sizeof(f));
19          for(int i=1;i<=n;i++)
20          {
21              for(int j=0;j<=v;j++)
22              {
23                  if(w[i]<=j) // 这件物品的重量小于当前的容量,也就是说放的进背包
24                  {
25                      // f[i][j] 表示第 i 件物品在背包容量为 j 时的状态,
26                      //所以 f[i-1][j] 表示背包在上一次容量为 j 时候的状态,也就是没放这件物品的时候
27                      f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+p[i]);// 比较 没放进去之前 和放进该物品后 的价值,取最大
28
29                  }
30                  else f[i][j]=f[i-1][j];  // 如果不能放进该物品,则取上一次的状态
31              }
32          }
33          printf("%d\n",f[n][v]);
34      }
35      return 0;
36  }

渣渣一枚,如果有什么不对的地方,还请各位大神批评指正~  (^_^)

转载于:https://www.cnblogs.com/ember/p/4701035.html

HDU2602 (0-1背包)相关推荐

  1. Python 0/1背包、动态规划

    参考:http://www.cnblogs.com/fcyworld/p/6243012.html Python 0/1背包.动态规划 0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同 ...

  2. P1417 烹调方案 (0/1背包+贪心)

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  3. 算法分析与设计——蛮力法0/1背包

    蛮力法0/1背包 蛮力法 蛮力法是一种简单直接解决问题的方法,常常直接基于问题的描述,所以蛮力法也是最容易应用的方法. 蛮力法所依赖 的基本技术是遍历,即采用一定的策略依次处理待求解问题的所有元素,从 ...

  4. 数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)

    回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束. 与贪心算法不同的是,回溯算法理论上是可以得到最优解, ...

  5. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  6. HDOJ 2602-Bone Collector(0/1背包模板、打印方案及滚动数组解法)

    0/1背包 一.Bone Collector 解法一:二维数组解法(0/1背包模板代码) 1.1 0/1背包打印方案代码 解法二:滚动数组(一维)解法 2.1 一维滚动数组例题 E-爱玩游戏的Tom ...

  7. 动态规划(五)——0/1背包

    0/1背包 一.0/1背包问题 1.实例讲解 2.DP求解0/1背包 3.输出0/1背包方案 二.0/1背包题目代码(持续更新) 一.0/1背包问题 给定n种物品和一个背包,物品i的重量为wi,价值为 ...

  8. HDU1248 寒冰王座【0/1背包+DP】

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. 动态规划算法初步(6)——0/1 背包

    动态规划算法初步(6) 例题五:0/1 背包(背包型) 题目: 一个旅行者有一个最多能装m公斤物品的背包,现在有n件物品,它们的重量分别是w1,w2,-,wn,它们的价值分别为c1,c2,-,cn.若 ...

  10. 【ICPC-283】hdu 2126 Buy the souvenirs(二维0/1背包)

    点击打开链接hdu2126 思路: 二维0/1背包 分析: 1 题目给定n个物品的价钱和m的钱,问最多能买到的物品数有几种方案. 2 很明显就可以写出状态转移方程dp[i][j][k]表示的是前i个物 ...

最新文章

  1. 5分钟实现Android中更换头像功能
  2. Delphi使用ADO组件访问ACCESS数据入门例程
  3. Redis有哪几种数据淘汰策略?
  4. UE/UX 设计师可临摹的应用模板!
  5. phpeclipse+xdebug配置
  6. 我从AI For Everyone学到的十个重要AI 概念
  7. 上预算管理软件,不如上EXCEL
  8. 定性和定量大数据分析方法指南
  9. 淘宝天猫评论爬取,简单的办法完成滑动验证
  10. Crystal Xcelsius 2008 使用Excel XML映射链接
  11. [HNOI2004]宠物收养所
  12. google网盘 百度网盘文件互传
  13. Pytorch CPU Tensor与GPU Tensor的运算速度对比测试
  14. (图解)设置封面中的下划线一样长
  15. VA软屏和IPS硬屏的区别
  16. axp202电源管理
  17. 基于ESO的永磁同步电机无感FOC 采用线性扩张状态观测器(LESO)估计电机反电势,利用锁相环从反电势中提取位置和转速信息
  18. Android 12 Beta正式亮相;5 月 19 日凌晨 1 点 阔别 2 年的 Google I/O 开发者大会内容集锦
  19. usee2008免费网络电视最新版下载
  20. Linux发展历史年表

热门文章

  1. linux线程池简单实例
  2. js中四种创建对象的方式
  3. 除了修改WEBCONFIG会导致WEB服务重启外,还有其他的什么操作会导致重启?
  4. Windows Phone 7.1 “芒果” SDK Beta 下载地址
  5. .NET Framework 如何:提高性能
  6. linux shell 自定义函数(定义、返回值、变量作用域)介绍
  7. The type sun.management.ManagementFactory is not visible
  8. libuv 原理_Libuv初理解
  9. 关于猿如何找对象,心里没点那啥数吗?
  10. java程序运行结果题_2016年关于Java编程与程序运行结果笔试题