05 神奇的口袋(背包问题)

描述

​ 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。

输入

​ 输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。

输出

​ 输出不同的选择物品的方式的数目。

样例输入
3
20
20
20
样例输出
3
分析

把问题分解为:在v的空间中正好装下前n个物品的个数, f ( v , n ) f(v,n) f(v,n);

递推公式为: f ( v , n ) = f ( v − v o l u m e [ n ] , n − 1 ) + f ( v , n − 1 ) f(v,n)=f(v-volume[n],n-1)+f(v,n-1) f(v,n)=f(v−volume[n],n−1)+f(v,n−1),表示包括n、不包括n的两种情况

//简单递归算法
int f(int w, int v)//f表示用前w个物品,凑空间v的凑法
{if (v == 0)return 1;//如果v=0,说明我已经调好了,这就是一种挑法,即不选任何东西,返回1if (w < 0)return 0;//进行到这里说明v!=0,而此时没有东西给我选了,这种做法不行return f(w-1, v) + f(w-1, v - volume[w]);//不选第w个物品和选第w个物品的做法之和就是结果
}//动归的递归形式
int f(int w, int v)//f表示用前w个物品,凑空间v的凑法
{if (w < 0 || v < 0)return 0;//进行到这里说明v!=0,而此时没有东西给我选了,这种做法不行if (v == 0){results[w][v] = 1;return 1;//如果v=0,说明我已经调好了,这就是一种挑法,即不调,返回1}//注意这里没有把这个递归出口前置,是因为可能出现volume<0的情况,此时访问会出现bugif (results[w][v] != 0)return results[w][v];results[w][v] = f(w - 1, v) + f(w - 1, v - volume[w]);return results[w][v];//不选第w个物品和选第w个物品的做法之和就是结果
}

神奇的口袋(背包问题)相关推荐

  1. Codeup-2044:神奇的口袋

    题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...

  2. 递归设计--八皇后+神奇的口袋+数列+吃糖果

    2019.01.26 是日晴朗,纪念下放假以来第一次9点起,最近怎么越活越回去呢,别再患得患失啦,过好当下就行哟~ 本文主要是递归设计练习的总结,包含以下内容(难度依次递减) 八皇后(N皇后):全排列 ...

  3. 动态规划之神奇的口袋问题

    问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40 John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1,a2,- ...

  4. 程序设计与算法----递归之神奇的口袋

    问题描述 问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40 John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1 ...

  5. Bailian2759 神奇的口袋(2)【DP】

    2759:神奇的口袋(2) 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是400,用这个口袋可以变出一些物品,这些物品的总体积必须是400.John现在有n ...

  6. 北大培训课动态规划----神奇的口袋(百练2755)

    北京大学暑期课<ACM/ICPC竞赛训练> ppt摘取 什么是动态规划? ●递归到动规的一般转化方法  递归函数有n个参数,就定义一个n维的数组,数组 的下标是递归函数参数的取值范围,数组 ...

  7. 动态规划之神奇的口袋

    动态规划之神奇的口袋 题目 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品的体积分别是a1, ...

  8. 神奇的口袋(动态规划)--算法学习

    问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出 一些物品,这些物品的总体积必须是40.  John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2--a ...

  9. 神奇的口袋——Java

    题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中 ...

最新文章

  1. java web 调用hadoop_Java及Web程序调用hadoop2.6
  2. 【高端】几个关于SCSS中for循环的高级玩法
  3. Windows7 64bit VS2013 Caffe train MNIST操作步骤
  4. Macbook pro 2016/2017 接入扩展坞时断 WIFI 问题的解决办法
  5. 服务器系统磁盘,服务器系统重装与磁盘阵列
  6. 【UGV】32版UGV原理图
  7. 听说你想去大厂看学妹,带你看看字节跳动后端开发面试长啥样?
  8. 非京籍上学有多难?从这些数据看真相
  9. [攻防世界 pwn]——guess_num
  10. 免费下载思科CCNP 642-143考试题库
  11. bool c语言_C/C++编程笔记:C语言结构体—位域,如何指定成员变量所占Bit?
  12. DIV制作浮在页面的窗口
  13. 初学者python笔记(hashlib加密、logging日志模块、configparser配置文件)
  14. Spark采用分区方式读取数据库时partitionColumn, lowerBound, upperBound, numPartitions的理解与验证
  15. 系统剪切板的使用UIPasteboard
  16. C++ 小游戏程序 (共七款)
  17. vga焊接线顺序_VGA线的焊接方法(VGA接头焊接方法)
  18. Untiy 接入 移动MM 详解 转
  19. 学习编程时真正值得一读的一篇文章 与 书籍
  20. 小小盗号VC实现原理

热门文章

  1. 下载英语四六级成绩单
  2. React Native API之—— Keyboard键盘相关
  3. Jupyter notebook文件默认存储路径更改方法
  4. 【升华网络】为你介绍淘宝
  5. React中微信H5支付实现代码
  6. OpenVP共用账号 一个账号多台电脑登录
  7. 【每日新闻】苹果VS华为,人工智能手机芯片生态“封闭”与“开放”之战 | 工信部下发2018年第7批CDN与云服务牌照
  8. 微信开放JS SDK,这场web巨变意味着什么?
  9. C++ 拷贝构造函数 赋值构造函数
  10. Windows Server 2012 R2服务器安装与配置