总Time Limit: 
10000ms 
Memory Limit: 
65536kB

有一个奇妙的口袋。总的容积是40,用这个口袋能够变出一些物品,这些物品的整体积必须是40。John如今有n个想要得到的物品,每一个物品的体积各自是a1,a2……an。John能够从这些物品中选择一些,假设选出的物体的整体积是40,那么利用这个奇妙的口袋。John就能够得到这些物品。如今的问题是,John有多少种不同的选择物品的方式。
Input
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数。分别给出a1。a2……an的值。
Output
输出不同的选择物品的方式的数目。

Sample Input
  1. 3
  2. 20
  3. 20
  4. 20
Sample Output
  1. 3

这题非常经典,能够用非常多方法来做,我试了下面几种:

DFS:耗时0ms

  1. #include <stdio.h>
  2.  
  3. int arr[22], ans, n, sum;
  4.  
  5. void DFS(int k)
  6. {
  7. if(sum >= 40){
  8. if(sum == 40) ++ans;
  9. return;
  10. }
  11. for(int i = k; i <= n; ++i){
  12. sum += arr[i];
  13. DFS(i + 1);
  14. sum -= arr[i];
  15. }
  16. }
  17.  
  18. int main()
  19. {
  20. int i;
  21. scanf("%d", &n);
  22. for(i = 1; i <= n; ++i)
  23. scanf("%d", arr + i);
  24. sum = ans = 0; DFS(1);
  25. printf("%d\n", ans);
  26. return 0;
  27. }

普通递归:耗时60ms

  1. #include <stdio.h>
  2.  
  3. int arr[22], n;
  4.  
  5. int getAns(int sum, int k)
  6. {
  7. if(sum == 0) return 1;
  8. if(k == 0) return 0;
  9. return getAns(sum, k - 1) + getAns(sum - arr[k], k - 1);
  10. }
  11.  
  12. int main()
  13. {
  14. int i;
  15. scanf("%d", &n);
  16. for(i = 1; i <= n; ++i)
  17. scanf("%d", arr + i);
  18. printf("%d\n", getAns(40, n));
  19. return 0;
  20. }

DP:耗时0ms

  1. #include <stdio.h>
  2.  
  3. int arr[22], n, dp[42][22];
  4. //dp[i][j]表示从前j种物品里配出价值i的方法数
  5. int main()
  6. {
  7. int i, j;
  8. scanf("%d", &n);
  9. for(i = 1; i <= n; ++i){
  10. scanf("%d", arr + i);
  11. dp[0][i] = 1;
  12. }
  13. for(dp[0][0] = i = 1; i <= 40; ++i){
  14. for(j = 1; j <= n; ++j){
  15. dp[i][j] = dp[i][j - 1];
  16. if(i - arr[j] >= 0) dp[i][j] += dp[i - arr[j]][j - 1];
  17. }
  18. }
  19. printf("%d\n", dp[40][n]);
  20. return 0;
  21. }

递推型DP:耗时0ms

  1. #include <stdio.h>
  2.  
  3. int n, sum[42];
  4. //sum[i]表示价值能组成i的方法数
  5. int main()
  6. {
  7. int i, j, temp;
  8. scanf("%d", &n);
  9. for(i = 0, sum[0] = 1; i < n; ++i){
  10. scanf("%d", &temp);
  11. for(j = 40; j; --j){
  12. if(j + temp > 40) continue;
  13. if(sum[j]) sum[j + temp] += sum[j];
  14. }
  15. ++sum[temp];
  16. }
  17. printf("%d\n", sum[40]);
  18. return 0;
  19. }

百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】的更多相关文章

  1. 百练2755:神奇的口袋(简单dp)

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

  2. NYOJ 10 skiing (深搜和动归)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且 ...

  3. 深搜基础题目 杭电 HDU 1241

    HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #incl ...

  4. DFS-BFS(深搜广搜)原理及C++代码实现

    深搜和广搜是图很多算法的基础,很多图的算法都是从这两个算法中启发而来. 深搜简单地说就是直接一搜到底,然后再回溯,再一搜到底,一直如此循环到没有新的结点. 广搜简单地说就是一层一层的搜,像水的波纹一样 ...

  5. HDOJ/HDU 1015 Safecracker(深搜)

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...

  6. [codevs1049]棋盘染色<迭代深搜>

    题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...

  7. C++ 深搜调错

    因为前两天某网站的比赛一个深搜错了,我只得了3等奖,我找不到错误,给别的大佬看他们又嫌恶心.emm……,比赛结束后我自己反思了一下,深搜写错了该怎么办,或者说怎样避免写错. 首先,变量名不要太ex,比 ...

  8. [深搜]C. 【例题3】虫食算

    C . [ 例 题 3 ] 虫 食 算 题目解析 正解 : Dfs + 剪枝 依题意,把样例以加法的形式展现出来. 根据加法的性质,可以得出有两种情况:有进位和没有进位的. 而从百位到最高位的结果,又 ...

  9. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

随机推荐

  1. iOS 格式化输出符号与类型转换

    1.iOS 格式化输出符号 %@    对象 %d,   %i 整数 %u     无符号整形 %f      浮点(双字节) %x,   %X  二进制整数 %o     八进制整数 %zi     ...

  2. javascript基础学习(十二)

    javascript之BOM 学习要点: 屏幕对象 History对象 Location对象 一.屏幕对象 Screen对象是一个由javascript自动创建的对象,该对象的主要作用是描述客户端的显 ...

  3. MyBatis学习笔记(3)—— 利用mybatis灌入假数据

    由于第三方厂商未能按时提供实时数据,故需要纯手动导入一些实时数据,用于统计分析.正好最近自己学习了mybatis .因此使用mybatis 配置一个select.insert 的简单操作语句,用于灌入 ...

  4. z-index的理解 z-index 属性仅在节点的 position 属性为 relative, absolute 或者 fixed 时生效.

    今天做游戏的Exercise模式的时候,发现把所有的div设置为position:absolute;后,点击play进入到游戏界面的时候,鼠标点击数字的时候,完全没反应.经过我的反复检查,发现只要给所 ...

  5. mysql操作之二

    特殊数据类型 表约束 表连接 索引 触发器 安全性 DB设计 alter table student modify id int primary key; 主銉不可重复修改 alter table s ...

  6. 栈的讲解 和 栈的生长方向 源代码技巧分析,简直没SEI 啦

    函数的局部变量,都是存放在"栈"里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,以战舰stm32开发板为例,在startup_stm32f1 ...

  7. 《30天自制操作系统》读书笔记(3) 引入C语言

    这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...

  8. Keil C51中变量和函数的绝对地址定位问题

    1.变量绝对地址定位 1) 在定义变量时使用 _at_ 关键字加上地址就可. unsigned char idata myvar _at_ 0x40;  把变量 myvar 定义在 idata 的 0 ...

  9. Qt for Android 开发大坑123

    http://blog.csdn.net/qyvlik/article/details/50989685 http://blog.csdn.net/qyvlik/article/details/515 ...

  10. Windows NT 驱动程序开发人员提示 -- 应注意避免的事项

    下面是开发人员在使用 Windows NT 设备驱动程序时应当避免的事项列表: 1.  一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度 ...