【Matlab】怎么生成23个范围为1-6的整数,且这些数的和为124急求!
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/16 14:36:48
【Matlab】怎么生成23个范围为1-6的整数,且这些数的和为124急求!
【Matlab】怎么生成23个范围为1-6的整数,且这些数的和为124
急求!
【Matlab】怎么生成23个范围为1-6的整数,且这些数的和为124急求!
硬干吧,
124/23 = 5.3913043478260869565217391304348,故肯定存在取值为6的.
124-5*23 = 9,故至少存在9个6;故问题转换为
怎么生成23-9=14个范围为1-6的整数,且这些数的和为124-9*6 = 70?
这个问题的复杂度为6^14 = 2^36.189475010096186540352345215269,
PC机几分钟可以算出来.
6的个数不得少于9个,问题转换为求14个大小在1-6之间数,它们之和为70;
14个数中,1的个数不得多于三个,否则加起来绝对会小于70;
这么一来只要做很少的循环就好了,运行时间不超过1秒~
我不太擅长编程,随便写了一个脑残的,结果还是可以的。
clear;clc;
a=0;
for n1=0:2
for n2=0:(14-n1)<...
全部展开
6的个数不得少于9个,问题转换为求14个大小在1-6之间数,它们之和为70;
14个数中,1的个数不得多于三个,否则加起来绝对会小于70;
这么一来只要做很少的循环就好了,运行时间不超过1秒~
我不太擅长编程,随便写了一个脑残的,结果还是可以的。
clear;clc;
a=0;
for n1=0:2
for n2=0:(14-n1)
for n3=0:(14-n1-n2)
for n4=0:(14-n1-n2-n3)
for n5=0:(14-n1-n2-n3-n4)
n6=14-n1-n2-n3-n4-n5;
if ((n1*1+n2*2+n3*3+n4*4+n5*5+n6*6)==70)
a=a+1;
M(a,:)=[n1 n2 n3 n4 n5 n6];
end
end
end
end
end
end
disp(M);
运行结果是矩阵M的值,它的每一行从第1列到第6列分别表示1-6这几个数出现的次数。
每一行再补上9个6就好了
收起
跑了20分钟 跑了129400个解 实在太花时间了,我给终止了。你可以跑完试试。 这个用C++跑应该会快很多,不知道有没有更快的解法。 a = zeros(1, 23); a(21) = 4; a(22) = 5; a(23) = 5; n = 0; A = zeros(10000000, 23); flag = 0; i = 0; while 1 n = n+1; A(n,:) = 6*ones(1, 23) - a; for i = 22:-1:0; if i == 0 flag = 1; break; end if( a(i) < 5 && a(i+1) > 0 ) j = i+1; k = 23; while( j < k ) c = a(k); a(k) = a(j); a(j) = c; j = j+1; k = k-1; end break; end end if flag break; end for j = i+1:23 if a(j) > 0 a(i) = a(i)+1; a(j) = a(j)-1; break; end end end