如何用VB使电脑穷举出排列组合的所有情况
发布网友
发布时间:2022-05-10 11:29
我来回答
共3个回答
热心网友
时间:2023-04-27 17:02
假设说形式是ax+by+cz=d,其中a、b、c、d已读取且均为正整数(从文本框中读取数值不会这个真的很没面子的)。为了有穷,又好写一些,再假设x、y、z均为正整数
下面的i、j、k依次表示x、y、z
dim a as long,b as long,c as long,d as long
dim i as long,j as long,k as long
for i=1 to (d\a)
for j=1 to ((d-a*i)\b)
k=d-a*i-b*j
print i,j,k
next j
next i
其实排列组合这样生成很不对劲的……不过既然是三元一次方程组,这样写就可以了。本质上就是循环的嵌套。
但是比如说生成1~20这20个数中取4个的所有组合的话,还是写一个递归的过程好。
public mem(0 to 4)as integer,check(1 to 20)as boolean
private sub f(byval dep as integer)
dim i as integer
if dep>=5 then
print mem(1),mem(2),mem(3),mem(4)
exit sub ‘这里检测生成的数量(或深入层数),如果达到要求那就输出并退回一层了
end if
for i=(mem(dep-1)+1) to 20-4+dep 'for循环起止处理一下,去掉不必要的循环,减少用时,也可以用 for i=1 to 20来替代,但后面要写不少额外检查条件,这样写其实就可以不用里面的检查了。
if check(i)=true then '其实本质很像深度优先搜索,有兴趣去网上查一下
check(i)=false
mem(dep)=i
f(dep+1)
mem(dep)=0
check(i)=true
end if
next i
end sub
private sub Command1_click()'界面上千万别忘了放一个按钮
dim j as integer
for j=1 to 20
check(j)=true
f(1)
end sub
(生成1~20这20个数中取4个的所有排列这个很无语的简单的……只需要4重循环+验重就可以了,当然,如果生成1~k这k个数中取n个的所有排列,且n和k不大的话,用递归现实一些。)
但是再大就有一些专门的方法来生成了。
热心网友
时间:2023-04-27 17:02
那就要看看是什么题了,对症下药。
热心网友
时间:2023-04-27 17:03
你是说排列组合问题?最好是给个题目来做,不然谁知道你要什么效果。追问解三元一次不等式