作者yauhh (哟)
看板Programming
标题Re: [问题] 排列组合,相同物品分发制不同容器
时间Sat Apr 14 12:11:03 2012
※ 引述《lovesnake (【忠犬攻一枚】)》之铭言:
: → yauhh:那你422之後怎麽还会出现422? 61.231.67.34 04/14 11:48
: → yauhh:我觉得422之後应该是431然後就到512了 61.231.67.34 04/14 11:49
:
: 喔~ 可能是有误解....我以为你是先做出八个相同的分三个相同的堆
: 然後再去排列
: 您说的是直接将後面的元素列为一个集合,随时修改他的极限值吗?
: 像是 10个分4堆
:
: {1 [1 (1 7)]} 这样吗?
: 最後一个Set总和八
: 第二个总和九
: 第一个总和十
: 然後最後一个SET组合都跑完了以後第二个SET+1 最後一个SET总和-1
: 继续跑?
:
: ※ 编辑: lovesnake 来自: 140.121.216.68 (04/14 11:54)
: → yauhh:喔我搞错了. P(6,3). 61.231.67.34 04/14 11:51
我初想一下以为我搞错,但自己写个程式算一下,结果可见我并没有搞错.
: 那种想法我有想过,可是程式该怎麽实作呢?
: 当初想到这个想法我以为有解了...结果程式写不出来XD
: 恳请赐教
: ※ 编辑: lovesnake 来自: 140.121.216.68 (04/14 11:55)
这个小小的Erlang程式,内容说求一列资料L中取N个项目的结果:
-module(test).
-compile(export_all).
perms([], _) -> [[]];
perms(_, 0) -> [[]];
perms(L, N) -> [[H|T] || H <- L, T <- perms(L, N-1) ].
执行时,算式如下:
#> io:format("~w", [[L || L<-test:perms(lists:seq(1,6), 3), lists:sum(L) ==
8]]).
[[1,1,6],[1,2,5],[1,3,4],[1,4,3],[1,5,2],[1,6,1],[2,1,5],[2,2,4],[2,3,3],
[2,4,2],[2,5,1],[3,1,4],[3,2,3],[3,3,2],[3,4,1],[4,1,3],[4,2,2],[4,3,1],
[5,1,2],[5,2,1],[6,1,1]]ok
我生不出重复的 4,2,2, 所以猜想,会重复产生的东西,应该是看你程式怎麽写.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.67.34
※ 编辑: yauhh 来自: 61.231.67.34 (04/14 12:11)
1F:推 lovesnake:重复是因为我误会你的想法~那个没事了~ 140.121.216.68 04/14 12:23
2F:→ lovesnake:Erlang...看不懂 糟糕了XD 140.121.216.68 04/14 12:23
3F:→ lovesnake:方便写PrusudoCode吗>"< 140.121.216.68 04/14 12:23
4F:→ lovesnake:错字= =Presudo 140.121.216.68 04/14 12:24
5F:→ lovesnake:那个Elang感觉好高阶...我还在用C++ 140.121.216.68 04/14 12:25
6F:→ lovesnake:又错字= =Erlang 140.121.216.68 04/14 12:26
perms([], _) -> [[]];
perms(_, 0) -> [[]];
perms(L, N) -> [[H|T] || H <- L, T <- perms(L, N-1) ].
意思是:
function perms( List, Number, Set )
if List = {} then Set := {{}}, return
if Number = 0 then Set := {{}}, return
for i := 1 to length(List)
Set1 := {}
perms( List, (Number - 1), Set1 )
for j := 1 to length(Set1)
Set := union(Set, concat(List[i], Set1[j]))
return
[L || L<-test:perms(lists:seq(1,6), 3), lists:sum(L) == 8]
意思是:
function take_the_set()
Set := {}
Set1 := {}
perms( {1,2,3,4,5,6}, 3, Set1 )
for i := 1 to length(Set1)
if sum(Set1[i]) = 8 then Set := union(Set, Set1[i])
return Set
※ 编辑: yauhh 来自: 61.231.67.34 (04/14 12:43)
7F:推 lovesnake:有点复杂= =" 待我研究一下 先谢过了 140.121.216.68 04/14 12:43