作业帮 > 综合 > 作业

有十个数,任取其中N个(N从1到10),使他们之和大于等于M,如何用C/C++编程求出所有组合并记录.

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/02 01:55:39
有十个数,任取其中N个(N从1到10),使他们之和大于等于M,如何用C/C++编程求出所有组合并记录.
例如这十个数是1到10,M=15.
取两个的话有:5,10; 6,10;……等组合.
取三个有 1,4,10; 2,3,10;……等组合.
依次类推.
然后将所有组合存入一个数组中.
有没有高级点的算法,不是无脑for循环.10个数只是假设,如果10变成了100,或者更多如何编写,能不能有具体程序?
有i个数,任取其中N个(N从1到i),使他们之和大于等于M,如何用C/C++编程求出所有组合并记录.
这个题目要求出并记录所有组合,所以for循环是省不了的,但是可以做到不无脑.
首先分析一下题目,设取出的N个数和为y,那么可以得出:
y的最大值为 i+(i-1)+(i-2)+···+(i-N+1)
进行检定:如果y的最大值小于M,那么无解;否则,y的最大值肯定满足条件,使用for循环,依次逐渐减小N个数的值,直至y=M,则输出了所有解.
代码我就不写了,算法如上,再举例说明一下最后中情况for循环的思路,就拿楼主的例子说明:
“十个数,从1到10,M=15,N=3”
首先,10、9、8必然满足条件,将第三个数从8开始减小,一直到1都满足条件;
然后,减小第二个数,起始为10、8、7,再将第三个数从7开始减小,一直到1都满足条件;
···
最终当循环到6、5、4时,再减小将不满足条件,输出完毕.
还有什么疑问,再追问