本题无法通过动态规划予以解决。

由于本题中 NNN 最大为 404040,生成所有子集显然不可行,需要适当变通。实际上,我们可以将数组分成两个数组 AAA 和 BBB,其大小只相差 111,分别生成 AAA 和 BBB 的所有子集和,由于 NNN 最大为 404040,则 AAA 的大小最大为 202020,AAA 中不同的子集和最多有 2202^{20}220 个,这是可行的。

对于数组 AAA 的每个子集和 sss,在数组 BBB 的子集和中查找 T−sT - sT−s 是否存在,若存在,则将数组 AAA 中子集和 sss 的数量 CsC_{s}Cs​ 乘以数组 BBB 中子集和 T−sT - sT−s 的数量 CT−sC_{T-s}CT−s​,这就是对总方案数的贡献,逐个处理数组 AAA 的所有子集和累加即可,算法的时间复杂度为 O(N×2N/2)O(N \times 2^{N/2})O(N×2N/2)。

可以使用 C++\texttt{C++}C++ STL\texttt{STL}STL 中的映射(map\texttt{map}map)来存储子集和的个数。
需要注意,在解题过程中还需考虑子集不能为空。

// Subset Sum
// UVa ID: 12911
// Verdict: Accepted
// Submission Date: 2021-11-11
// UVa Run Time: 1.630s
//
// 版权所有(C)2021,邱秋。metaphysis # yeah dot net#include <bits/stdc++.h>using namespace std;int N, T, si[41];
map<long long, int> Ca, Cb;int main(int argc, char *argv[])
{cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);while (cin >> N >> T){for (int i = 0; i < N; i++) cin >> si[i];int Na = N / 2;if (Na == 0) Na++;int Nb = N - Na;Ca.clear();for (int i = 1; i < (1 << Na); i++){long long sum = 0;for (int j = 0; j < Na; j++)if (i & (1 << j))sum += si[j];Ca[sum]++;}Cb.clear();for (int i = 1; i < (1 << Nb); i++){long long sum = 0;for (int j = 0; j < Nb; j++)if (i & (1 << j))sum += si[Na + j];Cb[sum]++;}long long cnt = 0;for (auto p : Ca)if (Cb.count(T - p.first))cnt += 1LL * p.second * Cb[T - p.first];cout << cnt + Ca[T] + Cb[T] << '\n';}return 0;
}

UVa 12911 Subset Sum相关推荐

  1. 动态规划法(三)子集和问题(Subset sum problem)

      继续讲故事~~   上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定.之后,他就决心去大城市闯荡了,看一看外面更大的世界.   这天,丁丁刚回到家,他 ...

  2. leetcode416. Partition Equal Subset Sum

    题目要求 Given a non-empty array containing only positive integers, find if the array can be partitioned ...

  3. leetcode 416. Partition Equal Subset Sum | 416. 分割等和子集(Java)

    题目 https://leetcode.com/problems/partition-equal-subset-sum/ 题解 乍一看是背包问题,但不同的是,本题要求结果等于某值,背包要求结果小于某值 ...

  4. 【leetcode】416. Partition Equal Subset Sum

    题目如下: 解题思路:对于这种判断是否的题目,首先看看动态规划能不能解决.本题可以看成是从nums中任选i个元素,判断其和是否为sum(nums)/2,很显然从nums中任选i个元素的和的取值范围是[ ...

  5. [UVA 10827] Maximum sum on a torus

    图片加载可能有点慢,请跳过题面先看题解,谢谢 这个题..没什么好讲的.. 把矩阵复制,4个拼到一起,二维前缀和+O(n^4) 枚举就过了..但是这个范围.. 不知道给的什么水数据.. 辣鸡题目.. $ ...

  6. LeetCode Partition Equal Subset Sum(动态规划)

    问题:给出一个数组,问是否可以分成两个子集,其和相等 思路:首先要求数组和是偶数,然后用动态规划来求. 用dp(i,j)表示第i步时和为j是否可行,则有dp(i,j)= dp(i-1,j) || dp ...

  7. 【经典问题】maximum subset sum of vectors

    AtCoder Beginner Contest 139 Task F Engines 题目大意 给定 $n$ 个二维向量,从中选出若干个,使得它们的和的模最大. 分析 这是一个经典问题,还有一种提法 ...

  8. UVa 10791 Minimum Sum LCM

    分析一波发现,将原数尽可能地分解成"质数的k次方"的和,会使得答案最大而数字和最小 于是就可以愉快地质因数分解了. 注意判断若n是质数,答案为n+1. 1 /**/ 2 #incl ...

  9. Subset sum problem

    给一个整数集合s和一个整数n,请问s中是否存在一个子集合,这个集合里的元素和 等于 n 采用动态规划进行求解: 1. 设集合x的最小和以及最大和分别是min,max,设一个二维数组 m[n][max- ...

  10. π-Algorithmist分类题目(3)

    原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...

最新文章

  1. mysql filde_备份一个约250G的mysql实例【xtrabackup备份方案对比】
  2. mysql 表空间收缩_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...
  3. TPAMI 2020 | 高分辨率网络对计算机视觉任务的影响
  4. windows无法安装到这个磁盘。选中的磁盘采用GPT分区形式
  5. 深入理解 KVC\KVO 实现机制 — KVC
  6. 面向对象类的使用(15)
  7. QGraphicsProxyWidget paintEvent(from 1+1 =2)
  8. cbv继承view是哪个包_包你一眼就心动!两款帅爆国产轿车来袭,选谁都不错
  9. adam优化_立即尝鲜!碾压Adam,最好的AI优化器RAdam来了
  10. [转载] C++子字符串查找及提取
  11. dva处理_dva中使用store管理数据的异步问题
  12. 信息系统项目管理师(2022年)—— 重点内容:信息化和信息系统(1)
  13. mysql数据库服务器默认端口_各个数据库的默认端口
  14. 深信服云终端aDesk_STD-200H、朵拉云云终端DC10 对比测试
  15. Yalmip变量操作
  16. Android icon图标网站
  17. python爬虫自学笔记本(2015.12.14)
  18. div 设置a4大小_A4纸网页打印 html网页页面的宽度设置成多少
  19. 小米路由器3G建站折腾笔记6 - 总结
  20. 计算机网络的时间,计算机网络时间同步技术原理介绍

热门文章

  1. PDF英文文档免费翻译成中文
  2. 翻译pdf中的英文 python_看不懂pdf中的英文?就用Python
  3. 百度,360,搜狗,必应浏览器网站收录提交(SEO优化)
  4. 神经网络视频/图像渲染相关经典论文、项目、数据集等资源整理分享
  5. python怎么爬虎牙_Python_虎牙妹子爬虫实现
  6. button加下划线
  7. 路飞学城-python开发集训-第一章
  8. Readyboost功能
  9. 从零开始搭建ROS智能小车@sp头子
  10. WPS上配置使用Endnote软件