2755:神奇的口袋

  • 查看
  • 提交
  • 统计
  • 提示
  • 提问

总时间限制:

10000ms

内存限制:

65536kB

描述

有一个神奇的口袋,总的容积是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

枚举法

思路简介:

n的范围较小,所以可以考虑用子集枚举

粗略了解子集枚举和位运算可戳如下链接

子集枚举/二进制/位运算 技巧小结 (带例题)C++_Prudento的博客-CSDN博客https://blog.csdn.net/Prudento/article/details/122723928?spm=1001.2014.3001.5502

AC代码如下

#include<bits/stdc++.h>
using namespace std;
#define MAX 21
int a[MAX];
int main(){int n;int cnt = 0;cin>>n;for (int i = 0; i < n; i++)cin >> a[i];for (int s = 0; s < 1 << n; s++) {int sum = 0;for (int i = 0; i < n; i++) {if ((s>>i)&1) {sum += a[i];}}if (sum == 40)cnt++;}cout << cnt;return 0;
}

递归法

思路详见注释

#include<bits/stdc++.h>
using namespace std;
int a[30];
int n;
int Ways(int w, int k) {//从前k种物品中选择一些,凑成体积w的做法数目//先设置边界条件if (w == 0)return 1;//如果体积不够了,那就是什么都不选,也是一种解法if (k <= 0)return 0;//如果物品没了,即不需要选了,即0种方法return Ways(w, k - 1) + Ways(w - a[k],k-1);//对于第k种物品,只有选或者不选两种情况//第k种不选方法数为Ways(w, k - 1),第k种选即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;
}

动归法

和上述递归法的思路相似,只不过是转成递推动归型,且减少了重复,提高了效率。

#include<bits/stdc++.h>
using namespace std;
int a[30];
int n;
int Ways[41][30];//Ways[i][j]表示从j种物品里凑出体积i的方法数//题目要求的即Ways[40][n]
int main(){cin >> n;memset(Ways,0,sizeof(Ways));for (int i = 1; i <= n; i++) {cin >> a[i];Ways[0][i] = 1;//需要凑的体积为0的时候只有一种方法,即什么物品都不选}Ways[0][0] = 1;//边界条件,什么都没有时,也是一种可能for (int w = 1; w <= 40; w++) {for (int k = 1; k <= n; k++) {Ways[w][k] = Ways[w][k - 1];if (w - a[k] >= 0)Ways[w][k] += Ways[w - a[k]][k - 1];}}cout << Ways[40][n];return 0;
}

神奇的口袋 C++ 三种方法(枚举,递归,动态规划)相关推荐

  1. js实现阶乘算法的三种方法

    js实现阶乘算法的三种方法 // 非递归写法 function f(n) {if (0 === n) {return 1;}let res = 1;for (let i = 1; i <= n; ...

  2. 获取cookie_抢券第一课:三种方法获取Cookie

    现在分享京东抢券是不是不合适?毕竟还没有到双十一或者其他京东大促的时间. 记得以往京东还有那种神券299减200,399减300.基本上都是到点进行抢购,而且还不一定能抢到.不过今天先来分享获取Coo ...

  3. ps添加的阴影怎么去除_【PS摄影后期教程】去除阴影色块三种方法

    点击蓝字关注这个神奇的公众号- 如何去除面部阴影色块 后期时模特面部有不均匀阴影色块 相信这个问题小伙伴们肯定都遇到过 不管是光的原因还是技术的问题 都是无可避免的 阴影有时候能帮助你调整视觉重心 或 ...

  4. 三种方法求最大公约数及求n个数的最小公倍数

    一.三种方法求两个数的最大公约数 (1) 辗转相除法 辗转相除法求最大公约数是一种常用的求两个数的最大公约数的方法. 方法是: 以小数除大数,如果能整除,那么小数就是所求的最大公约数.否则就用余数来除 ...

  5. 最优布线问题(三种方法)

    最优布线问题 题目 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们之间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当 ...

  6. c# 获得本地ip地址的三种方法

    网上有很多种方法可以获取到本地的IP地址.一线常用的有这么些: 枚举本地网卡 using System.Net.NetworkInformation; using System.Net.Sockets ...

  7. 从U盘运行Linux操作系统的三种方法

    摘要: 从U盘运行Linux操作系统的三种方法 usb_linux_0 你或许听说过在U盘上运行live Linux操作系统,但你知不知道可以永久的保存运行时的数据,或者直接将Linux安装到U盘?本 ...

  8. php100以内质数求和,100以内的质数_PHP质数计算三种方法 php求100以内的质数

    摘要 腾兴网为您分享:PHP质数计算三种方法 php求100以内的质数,自动刷宝,长沙银行,猿辅导,愈加等软件知识,以及cf一键刷枪,业主名录采集软件,卡乐光电,魔方虚拟光驱,掌上徐州,卡农社区,fa ...

  9. vscode打开终端的快捷键是啥? VScode打开终端的三种方法

    方法1:打开终端的快捷方法 打开VScode后,鼠标左键单击窗口顶部的[帮助](如下图红圈标注), 在下拉列表中找到[键盘快捷方式参考](如下图红框标注) 鼠标左键点击[键盘快捷方式参考], 会在浏览 ...

最新文章

  1. android vlc 参数,【VLC-Android】LibVLC API简介(至关于VLC的MediaPlayer)
  2. 存储控制器wwn号_正文-新华三集团-H3C
  3. Python虚拟环境pyenv、venv(pyvenv)、virtualenv之间的区别,终于搞清楚了!
  4. 存储控制器_SDRAM详解
  5. docker 安装 minio
  6. Spark的实战题目——寻找5亿次访问中,访问次数最多的人
  7. mysql约束_不是吧,阿Sir,MySQL约束你竟然还不懂!
  8. 机器人码垛搬运编程程序_码垛机器人市场进一步扩张,解放人力搬运跑不了了...
  9. word中如何将所有字母一次修改成新罗马字体
  10. python从零开始学习网站-7天从零开始学Python
  11. mysql replication 互为主从的安装及配置,以及数据同步
  12. Android之xUtils-3.0数据库框架详解
  13. 使用PC版Zune以全新的方式体验您的音乐
  14. gmoj 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树林
  15. AJAX框架眼镜穿搭夏天,30度的夏天,男生应该如何穿搭?看这9种时尚组合!
  16. 线上问题处理1---CPU飙高问题定位
  17. 微软提供的无限次延长Vista激活
  18. 天涯上拣来的爱情哲学
  19. 【玩转数据系列十五】机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)
  20. IDEA集成Java性能分析神器JProfiler

热门文章

  1. 罗扎诺夫高效记忆音乐【推荐试试】 - 雅思资料下载 - 鲤鱼网 - 专业的考试资料下载交流平台...
  2. Nebula 来了,支付宝 App 跨平台动态化框架
  3. 实现微信小程序web-view内嵌H5中的下载功能(大文件切片下载)
  4. c语言printf打印浮点型,printf以%d输出浮点数
  5. 分布式架构设计中的CAP原理
  6. 【matlab报错问题个人总结】数组超出索引维度
  7. 使用Trinity 软件进行拼接(无参转录组)
  8. MATLAB身份证号码定位检测识别GUI
  9. Gartner 魔力象限:数据中心备份和恢复解决方案 2020年
  10. Python中namedtuple()的使用