编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.
排列组合的题我一般想到的就是递归求解,或者说是深搜吧。
定义一个函数func(int pos,int k,int del);pos表示需要填充的数是第几个,k表示从k开始,del表示剩下数的和是多少是符合要求的。初始化自然是func(1,1,m)从1开始还需填充和为m的数,每次填充pos的数时,只能填充大于等于k的,不然会和其他解重复,如果当前k>del则不必再递归下去,因为永远也不会使和等于del了。
直接看代码吧:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.
排列组合的题我一般想到的就是递归求解,或者说是深搜吧。
定义一个函数func(int pos,int k,int del);pos表示需要填充的数是第几个,k表示从k开始,del表示剩下数的和是多少是符合要求的。初始化自然是func(1,1,m)从1开始还需填充和为m的数,每次填充pos的数时,只能填充大于等于k的,不然会和其他解重复,如果当前k>del则不必再递归下去,因为永远也不会使和等于del了。
直接看代码吧:
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- using namespace std;
- int m,n;
- int arr[100];
- //pos 填充arr[pos],从k开始,需要del的和
- void func(int pos,int k,int del){
- int i;
- if(del==0){
- for(i=1;i<=pos-1;i++)cout<<arr[i]<<" ";
- cout<<endl;
- return;
- }else if(del<k)return;
- for(i=k;i<=n;i++){
- if(del-i>=0){
- arr[pos]=i;
- func(pos+1,i+1,del-i);
- }
- }
- }
- int main(){
- while(scanf("%d%d",&n,&m)!=EOF){
- func(1,1,m);
- }
- return 0;
- }
转自:http://www.iteye.com/topic/1122363
本文介绍了一种通过递归实现的算法,用于找出所有可能的整数组合,这些组合来源于1到n之间的整数,并且它们的总和等于给定的整数m。文章详细解释了递归函数的工作原理,并提供了完整的C++代码示例。

1万+

被折叠的 条评论
为什么被折叠?



