**问题描述
已知N个大于0的整数构成一个集合,即{1,2,3,……,N},求其所有的非空且元素不相邻的子集,计算所有子集的乘积的平方的和。
例如:集合{1,2,3,4},其所有非空不相邻子集有{1},{2},{3},{4},{1,3},{1,4},{2,4}
这些子集的乘积的平方和为:
11+22+33+44+(13)(13)+(14)(14)+(24)(2*4)
=1+4+9+16+9+16+64
=39+80
=119
请输入一个整数N(1<=N<=100),表示集合M中的N元素分别为1、2、……、N。输出一个数T,表示集合M中的所有非空不相邻子集中各元素乘积的平方和。
输入
4
输出
119

这题刚开始做的时候,我是用想用队列的方式写:
如开始时队列有
1------>1出队------->此时到2 2与1是相邻,所以不做处理,直接相加,此时为sum=1²+2²=5.
此时队列有2个数,此时到3,1出列与3不是相邻所以sum+=(1*3)²······
一直这样求下去,后来发现,到了双位数就不好处理,而且题目要求99,如此下去队列肯定会炸,而且时间复杂度过不去,算个1分钟结果也出不来的。所以就往另一个方向想。

后来想到的方法是,递推方法   如图:


n从1开始一直添加到n,从n=3开始,你会发现相邻的是不可能的,直接排除,相差2的,即为1的所有子集(包括自己)与3都是不相邻。n=5时,n=3符合、n=6时,n=4符合。。。依次递推下去
因此,复杂度一下子从指数级别下降到O(n),很强势!!
不过现在还有一个问题,就是大数处理,我这里用JAVA的大数,C/C++的话需要自己写一个大数乘法。
JAVA代码如下:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sn = new Scanner(System.in);int n = sn.nextInt();sn.close();BigInteger a1 = new BigInteger("1");BigInteger a2 = new BigInteger("5");for(int i = 3;i<=n;i++){BigInteger ii = new BigInteger(i+"");BigInteger temp = a2.add(a1.add(BigInteger.ONE).multiply(ii.multiply(ii)));//递推式子,计算此次的和a1=a2;a2=temp;}System.out.println(n==1?1:a2.toString());//如果输入的n为1,则答案就为1,如果其他值输出a2的值}
}

求一个集合的所有子集问题实现相关推荐

  1. 求一个集合的所有子集 Python实现

    求一个集合的所有子集 Python实现 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat ...

  2. 求一个集合的所有子集

    题目描述 求一个集合的所有结合,例如集合{A,B,C}的所有子集为:{},{A,B,C},{A,B},{A,C},{B,C},{A},{B},{C}. 思路 实际上求子集问题是一个经典的DFS,每一次 ...

  3. 求一个集合的所有子集问题

    一个包含n个元素的集合,求它的所有子集.比如集合A= {1,2,3}, 它的所有子集是: { {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}, @}(@表示空集 ...

  4. C++实现输出一个集合的全部子集

    在学习C++时遇到的一个问题:用递归实现一个集合全部子集的输出. 一开始感觉好难,虽然个数和思路很好想,有n个元素,就有2n个子集,0表示没有,1表示有. 但是如何用递归代码实现呢? 思路:类似于二进 ...

  5. 输出一个集合的所有子集

    输出字符串的所有子集 如:对"abc" 输出:  c b bc a ac ab abc 第一种做法: 2^n 遍历每个字符,每个字符只能取或者不取.取就把该字符加入结果中,遍历完毕 ...

  6. 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况

    求一个集合S的m个元素组合的所有情况,并打印出来,非常适合采用递归的思路进行求解.因为集合的公式,本身就是递归推导的: C(n,m) = C(n-1,m-1) + C(n-1,m). 根据该公式,每次 ...

  7. 尾调用优化 java_基于Java8函数式编程求一个List的全部子集|尾调用优化解决递归性能问题...

    目录 基于函数式编程求一个List的全部子集 代码来自<Java8 in Action>,思路和其他递归解决方法一致,但不同的地方在concat方法 public static List& ...

  8. 求一个集合的子集个数的方法

    假设一个集合包含n个元素,要求计算该集合的子集个数. 该集合的所有子集,也叫该集合的幂集,比如集合{1,2,3}的所有子集为 空集,{1},{2},{3},{1,2},{1,3},{2,3},{1,2 ...

  9. 教你如何求一个集合的所有非空子集的方差和

    /题目: 注:要求提交程序源代码和执行结果,编程语言不限. 1.对于一个大小为n的数集,求出该数集的每个"非空子集"的方差之和对10°+7取模的结果. 附件1说明:第一行一个正整数 ...

最新文章

  1. python 获取文件列表_python获取文件列表
  2. 系统应用iPad设备应用需定制开发的3大理由
  3. mysql最大连接数合理值_MySQL服务器最大连接数的合理设置
  4. react dispatch_梳理下redux、mobx 在react的应用
  5. html5经纬度 ios,iOS 如何根据经纬度来定位位置(示例代码)
  6. CorelDRAWX4的VBA插件开发(二)怎么查看开发者PDF文档和VBA内的对象浏览器
  7. python登录系统账号检测_使用Python脚本检测邮件账户密码是否被泄漏,提高你的账户安全性...
  8. 计算语言学之语言理解与认知(1)
  9. 【前端面试题】2021秋招+金九银十,看完这些就够了 最新前端面试总结 68道前端面试题,助你进大厂
  10. ICLR 2022最佳论文解读
  11. 右侧追击(二)——券商行业
  12. 恭喜EDG 夺得冠军
  13. 【叶子函数分享三十】SQL简繁转换函数
  14. 前端Vue和计网面试题总结
  15. Mars3D(含Cesium)数据及服务篇:单体小模型转为glTF格式
  16. storyboard 使用
  17. android sd卡目录查看,Android sd卡目录详解
  18. iOS 集成聚宝云支付
  19. CSS @page 规则 设置打印页面框的尺寸,方向和页边距,用于打印预览和从浏览器打印Web文档
  20. ps基础教程新手入门第一篇:ps界面的介绍

热门文章

  1. linux bash安装教程,linux bash命令怎么用?win10 linux bash命令使用教程
  2. android 科大讯飞离线命令词的使用
  3. python随手记自动记账_对着微信说一声,它就能帮你自动记账并归类,小编已上瘾...
  4. linux网络-网卡驱动分析(基于imx6ul和ZYNQ分析)
  5. profile参数详解
  6. [转]Go程序GC优化经验分享
  7. GitHub上最火的22个Android开源项目源码(最少的一个也超过10k star)
  8. 计算广告关键技术:他们怎么什么都知道?
  9. 学习jav的第十六天,吃货联盟订餐系统
  10. vscode中检查代码插件:flake8