算法题目:完备划分

gushaoping 2003-12-09 06:14:05
一个正整数如果能拆分成若干个正整数之和,即N=a1+a2+a3+....+ak且正整数1,2,...,N均可以唯一地表示成这个拆分中某些拆分项这和,那么N的这个拆分称为N的一个完备剖分.例如7=4+1+2,1=1,2=2,3=1+2,4=4,5=4+1,6=4+2
于是可知7=4+2+1是7的一个完备剖分.
设计一个算法,枚举出正整数N的所有完备剖分,并统计完备剖分总数.

...全文
91 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gushaoping 2003-12-17
  • 打赏
  • 举报
回复

各位都是数学高手,真是今我汗颜,如果没有其它意见,我就照这个结论做了,

那程序将会很短,显然题目出得有点问题.
zzwu 2003-12-12
  • 打赏
  • 举报
回复
对!也就是说:
1。任何自然数都可以用2进制唯一表示,且
2。只有2^k-1这种数能唯一拆分成1+2+4+...这样的项。
mathe 2003-12-12
  • 打赏
  • 举报
回复
不对
6=1+2+3
那么3有两种剖分
3=3
3=1+2
证明很简单
使用唯一剖分,用归纳法证明
1,2,4,...分别出现,
1=1唯一可能
2=2, (不能1+1,不然两个1,1的剖分不唯一)
3=1+2,所以3不能出现,不然3有两个剖分。
4=4,必然有4,
5=1+4,所以不能有5,不然有两种剖分。
...
liem 2003-12-12
  • 打赏
  • 举报
回复
n=2^k-1肯定有完备剖分,
n=1+2+4+...+2^(k-1)是个完备剖分。(用数的二进制表示就可证明)。
但不是只有这种情况才有完备剖分。如6=1+2+3,这是一个完备剖分。
BlueSky2008 2003-12-12
  • 打赏
  • 举报
回复
sorry,没看到唯一性这个条件。mathe是正确的。我刚才也写了个证明,如下:

设N 的完美划分表示成 a + [S],a是完备划分中最大的一个数,S是其它数的集合。
[S]表示S中所有元素的和。

则S 必可表示0~a-1 的所有数,[S]>= a-1 .

再证明S 恰是a-1 的完备划分。

假设[S] = [A] + [T], ([A] = a-1) 现在要证明T是空集。

假设T不是空集,t∈T,

则取A集合所有元素和t构成一个数:[A] + t = (a-1) + t = a + (t-1)

若 t = 1,则[S] 可以表示 a
若 t > 1,又t<a,所以(t-1)这个数必可以用S中的元素表示。
这样(a+t-1)这个数就总有两种表示,矛盾。

综上:N 的完备划分必可表示成 a + (a-1)的完备划分。
由于1是完备划分,这样可推出有完备划分的数是1,3,7,15...2^n-1,完备划分就是所有小于N的2的幂。

mathe 2003-12-11
  • 打赏
  • 举报
回复
很简单,只有n=2^k-1这种情况才有完备剖分,而且只有唯一的剖分。
gushaoping 2003-12-11
  • 打赏
  • 举报
回复

听大家一分析,题目似乎很复杂,事先不知道问题有没有解,

找出一组剖分是个递归回溯的问题,有一组剖分后判断是不是完备的又是一个典型的0,1背包递

归回溯问题,目前可能只有这种方法.

按BlueSky2008(懒惰是程序员的美德)的思想用递归的方法做下去,遇到了问题,终止条件

不好给,BlueSky2008是不是隐含着在拆分的过程中有剪枝条件呢?往大家花点时间帮我出点主



amdcwf 2003-12-11
  • 打赏
  • 举报
回复
请楼上给出数学证明
amdcwf 2003-12-10
  • 打赏
  • 举报
回复
在做这个算法之前
我们先来看看存在性问题,即如何知道一个整数能否完备划分?
如果需要穷举后,才能知道,那么这个问题就很是个复杂问题了
因为,这类问题的复杂度都很高,就比如将1块钱用1分,2分,5分来拆分
且要求每种硬币至少出现一次,那么在最坏情况下问题的求解空间为
100*50*20,也就是说这类问题的求解空间复杂度是N1*N2*N3...Nn
而对于这道硬币问题,则是100*50*20,显然这道硬币问题的问题规模很小
//

niejx 2003-12-10
  • 打赏
  • 举报
回复
值得怀疑这是不是一个NP问题
gushaoping 2003-12-10
  • 打赏
  • 举报
回复

是不是 a<=(N+1)/2 ?

比如7最大剖分因子可达4,然后看(7-4)的所有剖分.依此可得一组解4 2 1

如果最达只可达 N/2(即3)则得不到解.当然这里目的是确保后面的数一定要小于前面的数而且

不重复.如 24可从12尝试起,后面的数都比12小,但我不敢肯定解没有重复的.
BlueSky2008 2003-12-09
  • 打赏
  • 举报
回复
就是将N 拆成 a + (N-a)的完备剖分(a <= N/2)。

33,029

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧