背包是典型的动态规划问题,关于背包问题的详解,推荐博客:点击打开链接(这篇博客有点错误,代码for循环里错了,不过讲解 的很详细)

题目如下:

在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。

Input 第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000)
第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000) Output 输出可以容纳的最大价值。 Sample Input
  1. 3 6
  2. 2 5
  3. 3 8
  4. 4 9

Sample Output

  1. 1

二维的太大的话容易超内存,写小了容易WA,建议写一维的。

下面是二维的代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. const int Max=10005;
  5. int w[105],p[105],f[105][Max]; //f的第二维要开大点,因为下面for循环第二维是从0一直到V
  6. using namespace std;
  7. int main()
  8. {
  9. int n,V;
  10. scanf("%d%d",&n,&V);
  11. memset(f,0,sizeof(f));
  12. for(int i=1;i<=n;i++)
  13. scanf("%d%d",&w[i],&p[i]);
  14. for(int i=1;i<=n;i++){
  15. for(int v=0;v<=V;v++){
  16. if(v<w[i]) f[i][v]=f[i-1][v];
  17. else f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+p[i]);
  18. }
  19. }
  20. printf("%d",f[n][V]);
  21. return 0;
  22. }

然后是一维的代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. const int Max=10500;
  6. int w[105],p[105],f[Max]; //f要开大一点,因为下面for循环v是逐一取值递减
  7. int main()
  8. {
  9. int n,V;
  10. scanf("%d%d",&n,&V);
  11. memset(f,0,sizeof(f));
  12. for(int i=1;i<=n;i++)
  13. scanf("%d%d",&w[i],&p[i]);
  14. for(int i=1;i<=n;i++){
  15. for(int v=V;v>=w[i];v--){
  16. f[v]=max(f[v],f[v-w[i]]+p[i]);
  17. }
  18. }
  19. printf("%d",f[V]);
  20. }

51Nod1085 0-1背包(一维和二维数组实现)的更多相关文章

  1. np.unique()对一维和二维数组去重

    numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)[source] 一 ...

  2. Mojo 返回一维和二维数组

    这种情况不断的网数组@arr2里放入数据,返回的内容为: 这种情况是一维数组: while( $selStmt->fetch() ){ print "\$a1 is $a1\n&quo ...

  3. C#如何定义一个变长的一维和二维数组

    1.假设将要定义数组的长度为程序执行过程中计算出来的MAX List<int> Arc = new List<int>(); ; i < MAX; i++) { Arc. ...

  4. Piggy-Bank(多重背包+一维和二维通过方式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题面: Problem Description Before ACM can do anythi ...

  5. 问题 A: 【动态规划】采药_二维数组_一维数组

    问题 A: [动态规划]采药 时间限制: 1 Sec  内存限制: 64 MB提交: 35  解决: 15[提交][状态][讨论版] 题目描述 山洞里有一些不同的草药,采每一株都需要一些时间,每一株也 ...

  6. 转:用STL中的vector动态开辟二维数组

    用STL中的vector动态开辟二维数组 源代码:#include <iostream>#include <vector>using namespace std;int mai ...

  7. C语言中的二维数组

    1.二维数组的定义和引用 一. 数据类型 数组名[常量表达式1][常量表达式2]; (1)假如有个二维数组array[n][m],则行下标的取值范围0~n-1 (2)列下标的取值范围0~m-1 (3) ...

  8. C Program基础-二维数组

    一维数组可以看作一行连续的数据,只有一个下标.C语言允许构造二维数组甚至多维数组,在实际问题中有时候常常需要用到二维数组(例如数学上的矩阵),二维数组有两个下标,以确定某个元素在数组中的位置. (一) ...

  9. 6.javaScript中的二维数组

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. liunx命令用到的

    su:切换成root用户 sudo su:普通用户申请root权限 ping命令可以检查linux是否联网 ping www.baidu.com 如图就是联网了 结束ping包括其他linux的指令 ...

  2. 阿里云服务器 :Linux环境下搭建Apache+php+mysql

    以前我用的是Windows2012 的服务器,那时候只是抱着玩一玩的心态,所有用的是Windows,但是后来被导师给DISS了,于是决定改服务器的操作系统: (一)下载安装php+mysql+apac ...

  3. Pie Chart _Study

    1.Select a theme 2.Experiment with visual customization 3.Creat a script 4.Name should be as defined ...

  4. 201706 Ruby 基础 & 元编程

    yield yield self Proc yield带参数 rails中:yield 和 content_for methods.proc.lambda.block 闭包(用proc延长变量的生命周 ...

  5. 第1节 IMPALA:1、impala的基本介绍

    impala的介绍: impala是cloudera公司开源提供的一款高效率的sql查询工具 impala可以兼容hive的绝大多数的语法,可以完全的替代表hive impala与hive的关系:紧耦 ...

  6. Swift 语法糖then

    then是一个swift初始化库,只有80几行的代码库,确可以让初始化变得很优雅. 1.使用then初始化AnyObject,这里以初始化控件为例 lazy var label = UILabel() ...

  7. 7.1 Varnish VCL

    根据以上的配置增加集群,修改default.vcl # This ) # man page for details on VCL syntax and semantics. # # Default b ...

  8. DCGAN生成目标训练图片

    前言: GAN的原理很简单,但是它有很多变体,如:DCGAN.CycleGAN.DeblurGAN等,它们也被用在不同地方,本文将用到DCGAN来生成头像图片,可以做到以假乱真的地步. 1.首先调用程 ...

  9. 应用于Oculus Quest的VR头显应用

    项目需要一个VR头显项目来展示算法成果,设备为Oculus Quest一体机,基于android平台(平台要切换为android),体验了下设备效果还行,但还是有点沙窗效应.记录一下开发流程. 先贴个 ...

  10. Arduino - 看门狗定时器(WDT:Watch Dog Timer)

    看门狗定时器(WDT:Watch Dog Timer)实际上是一个计数器. 一般给看门狗一个大数,程序开始运行后看门狗开始倒计数. 如果程序运行正常,过一段时间CPU应该发出指令让看门狗复位,令其重新 ...