问题描述

问题描述
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40
John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1,a2,…an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式
输入
输入的第一行是正整数n(1<=n<=20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2…an的值
输出
输出不同的选择物品的方式的数目
输入样例

3
20
20
20

输出样例

3

程序代码

解法1

#include<iostream>
using namespace std;
#define MAXSIZE 50
int a[MAXSIZE]; //存放物品体积的数组
int count;      //记录总的做法的数目
int n;          //物品数
//从前k个物品中选择一些,使得袋子中的剩余体积为m
void do_packet(int k,int m){//当袋子装满了之后 if(m==0){      count++;return ;}else{//当袋子没有装满,就再剩余的物品中选择一个能装进袋子中的物品 for(int i=0;i<n;i++){if(i>k&&m>=a[i]){do_packet(i,m-a[i]);}}}
}
int main(){cin>>n;count=0;for(int i=0;i<n;i++){cin>>a[i];}   do_packet(-1,40);cout<<count;
}

```cpp
#include<iostream>
using namespace std;
#define MAXSIZE 50
int a[MAXSIZE]; //存放物品体积的数组
int n;          //物品数
//从前k个物品中选择一些,凑成体积w的做法数目
int ways(int w,int k){//当没有需要凑的体积了,前k中物品我们一个都不选,也是一种做法,所以return1//实际上此时袋子已经放满了 if(w==0){return 1;}//当k<=0,说明物品已经试完了,但是我们袋子中还有剩余的体积 if(k<=0){return 0;}//当不满足边界条件时, 我们有两种情况,一是选第k种物品,另一种是不选第k种物品。 return ways(w,k-1)+ways(w-a[k],k-1);
}int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];} cout<<ways(40,n);return 0;
}

解法2

#include<iostream>
using namespace std;
#define MAXSIZE 50
int a[MAXSIZE]; //存放物品体积的数组
int n;          //物品数
//从前k个物品中选择一些,凑成体积w的做法数目
int ways(int w,int k){//当没有需要凑的体积了,前k中物品我们一个都不选,也是一种做法,所以return1//实际上此时袋子已经放满了 if(w==0){return 1;}//当k<=0,说明物品已经试完了,但是我们袋子中还有剩余的体积 if(k<=0){return 0;}//当不满足边界条件时, 我们有两种情况,一是选第k种物品,另一种是不选第k种物品。 return ways(w,k-1)+ways(w-a[k],k-1);
}int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];} cout<<ways(40,n);return 0;
}

程序设计与算法----递归之神奇的口袋相关推荐

  1. 程序设计与算法----递归之放苹果问题

    问题描述 例题:放苹果 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问公有多少种不同的分法?5,1,1和1,5,1是同一种分法 输入 第一行是测试数据数目t(0<=t<=2 ...

  2. 程序设计与算法----递归汉诺塔问题

    汉诺塔 古代有一个梵塔,塔内有三个座A,B,C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移动到C座,但每次只能允许移动一个盘子,并且在移动的过程中 ...

  3. 程序设计与算法----递归之n皇后问题

    问题描述 例题:n皇后 n皇后问题:输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击(即n个皇后可以横着吃,斜着吃,竖着吃.),输出全部方案. 输入一个正整数N,则程序输出N皇后问 ...

  4. 程序设计与算法----递归之爬楼梯问题

    爬楼梯 树老师爬楼梯,它可以每次走1级或者2级,输入楼梯的级数,求不同的走法数 例如:楼梯一共有3级,它可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共有3种走 ...

  5. 《算法笔记》4.3小节——算法初步-递归-问题 C: 神奇的口袋(oj:Codeup墓地)

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

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

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

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

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

  8. Bailian2755 神奇的口袋【递归+DP】

    2755:神奇的口袋 总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得 ...

  9. 神奇的口袋 C++ 三种方法(枚举,递归,动态规划)

    2755:神奇的口袋 查看 提交 统计 提示 提问 总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是 ...

最新文章

  1. vue-route动态路由
  2. WireShark 实例分析笔记(概念)
  3. find命令查找某些文件并将其拷贝到指定目录
  4. php实现按时间排序_按时间排序的问题?
  5. Pycharm中无法导入各种Python模块,pip不能更新的解决办法
  6. 工商银行黄金开户问答题答案
  7. 这就是数据分析之numpy
  8. JAVA-上转型对象,下转型对象
  9. 《普林斯顿微积分读本》笔记-第1章函数、图像和直线
  10. 成功GET一款高大上又不显俗的Linux时间锁屏软件-GLUQLO
  11. 自动驾驶汽车是如何利用高精度地图和高精度定位来进行“导航”的
  12. 中国伸缩式起重机行业市场供需与战略研究报告
  13. import keras时遇到的错误 TypeError: Descriptors cannot not be created directly. If this call came from a _
  14. python 卡片概念学习
  15. 【重读.转】黑客帝国中的佛法义理
  16. 明伟LRS-350-24方案,送BOM表,原理图、PCB
  17. 联想拯救者R720-15ikbn安装黑苹果Mac Catalina 10.15.3
  18. python实践答辩ppt_如何制作优秀的毕业论文答辩 PPT?
  19. 用技巧] Http请求偶尔超时+总结各种超时死掉的可能和相应的解决办法
  20. 档案馆容灾备份案例分享

热门文章

  1. 5月21日伦敦见!荣耀20官宣:P30“同款”ToF镜头加持?
  2. 周鸿祎:融360与360公司没有任何关系
  3. Spring容器创建流程(8)初始化bean
  4. 晨哥真有料丨这才叫真正的宝藏女孩!
  5. android跳转到相册需要权限,Android打开相册获取图片路径
  6. birt中文手册在线_QGIS简体中文翻译现状
  7. Oracle出现 The Network Adapter could not establish the connection
  8. mysql群集配置_MySQL主主集群配置
  9. 【kafka】kafka broker 限流 topic 限流 配额
  10. 【Kafka】kafka Removed ✘✘✘ expired offsets in ✘✘✘ milliseconds.