如何将2n表示为n个变量的总和Java实现?

如何解决如何将2n表示为n个变量的总和Java实现?

| 我想知道是否有一种优雅的方法可以将2n的所有成分导出为n个非负整数变量的总和。 例如,对于n = 2个变量x和y,有5个成分分为两部分: x = 0 y = 4; x = 1 y = 3; x = 2 y = 2; x = 3 y = 1; x = 4 y = 0 这样x + y = 4 = 2n。 更一般而言,可以制定问题以将s的所有组成都找到n个非负整数变量,它们的和等于s。 任何有关如何有效计算此问题的建议都将受到欢迎,一些伪代码将不胜感激。谢谢。 编辑:虽然下面在Perl和Prolog中介绍了解决方案,但是Java实现可能会出现一个新问题,因为在递归调用期间需要传递和操纵线性数据结构(例如数组),并且随着n的获得,这种做法会变得非常昂贵更大,我想知道是否存在替代(更有效)的Java实现来解决此问题。     

解决方法

这是一些python:
def sumperms(n,total = None):
   if total == None: 
       # total is the target sum,if not specified,set to 2n
       total = 2 * n

   if n == 1: 
      # if n is 1,then there is only a single permutation
      # return as a tuple.
      # python\'s syntax for single element tuple is (element,)
      yield (total,)
      return

   # iterate i over 0 ... total
   for i in range(total + 1):
      # recursively call self to solve the subproblem
      for perm in sumperms(n - 1,total - i):
         # append the single element tuple to the \"sub-permutation\"
         yield (i,) + perm

# run example for n = 3   
for perm in sumperms(3):
   print perm
输出:
(0,6)
(0,1,5)
(0,2,4)
(0,3,3)
(0,4,2)
(0,5,1)
(0,6,0)
(1,5)
(1,4)
(1,3)
(1,2)
(1,1)
(1,0)
(2,4)
(2,3)
(2,2)
(2,1)
(2,0)
(3,3)
(3,2)
(3,1)
(3,0)
(4,2)
(4,1)
(4,0)
(5,1)
(5,0)
(6,0)
    ,恰好在n个非负部分中的2n的合成数量(排序重要的和)为二项式系数C(3n-1,n-1)。例如,如上所述,当n = 2时,C(5,1)= 5。 要看到这一点,请考虑排列3n-1个位置。选择其中n-1个子集,然后将“ dividers”放在这些位置。然后,将剩余的空白位置分为两个分隔符之间的n个组(分隔符相邻的一些空组)。因此,您已经构造了所需组成与空间和分隔线的对应关系,并且分隔线显然被算作一次取n-1的3n-1个事物的组合。 为了列举所有可能的组成,我们可以编写一个程序,实际上从列表[1,...,3n-中选择n-1个严格增加的项s [1],...,s [n-1]。 1]。根据上述规定,对于“ i = 1,...,n”,“ parts”将为x [i] = s [i]-s [i-1]-1(按s [0]的约定) = 0且s [n] = 3n。 出于列出成分的目的,更优雅的方法是从列表[0,...,2n]中选择n-1个微增项t [1],...,t [n-1]并计算部分x [i] = t [i]-t [i-1],其中i = 1,...,n,约定t [0] = 0且t [n] = 2n。 这是一个简短的Prolog程序,它使用P个非负数部分提供了N的更一般的列表:
/* generate all possible ordered sums to N with P nonnegative parts */

composition0(N,P,List) :- 
    length(P,List),composition0(N,List).

composition0(N,[N]).
composition0(N,[H|T]) :-
    for(H,N),M is N - H,composition0(M,T).
谓词compostion0 / 3将其第一个自变量表示为以第二个自变量为长度的非负整数列表(第三个自变量)的总和。 该定义需要一些实用程序谓词,这些谓词通常由实现提供,可能形式略有不同。为了完整性,对于/ 3的计数谓词和列表谓词的长度的Prolog定义如下:
for(H,H,N) :- H =< N.
for(H,I,N) :-
    I < N,J is I+1,for(H,J,N).

length(P,List) :- length(P,List).

length(P,[ ]) :- !.
length(P,Q,[_|T]) :-
    R is Q+1,length(P,R,T).
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res