转载自:http://blog.sina.com.cn/s/blog_7571423b01016707.html
编程求解:输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,使其和等于 m , 要求将其中所有的可能组合列出来.
分析:
参考代码
1: #include
2: #include
3: #include<<SPAN style="COLOR: #0000ff">string.h>
4: void myDump(int aux[], int n)
5: {
6: for (int i=0; i
7: if (aux[i]) // 0标示未选择该数字
8: printf("=", i+1);
9: printf("\n");
10: }
11:
12: void helper(int dest, int idx, int aux[], int n)
13: {
14: if (dest == 0) // m减为0时,找到一个组合,输出
15: myDump(aux, n);
16:
17: // 递归结束条件:dest=0,说明找到一个组合;dest<0,说明该组合不满足(和大于m);
18: // 如果idx=n,则说明已达到规定的最大数字(范围为1-n)
19: if (dest <= 0 || idx==n)
20: return;
21:
22: helper(dest, idx+1, aux, n);
23: aux[idx] = 1; // 标示选择了数字idx+1
24:
25: //因为已经选择了idx,即选择了数字idx+1,所以将m减去idx+1
26: helper(dest-idx-1, idx+1, aux, n);
27: aux[idx] = 0; //无论结果是否满足,都需要取消原来已选择的数字idx+1,然后尝试另一种组合
28: }
29:
30: void findCombination(int n, int m)
31: {
32: if(n>m) //因为和为m,所以大于m的数肯定不行
33: n=m;
34:
35: int* aux=new int[n];
36: memset(aux, 0, n*sizeof(int));
37:
38: helper(m, 0, aux,n);
39:
40: delete[] aux;
41: }
42:
43: int main()
44: {
45: int n,m;
46: scanf("%d,%d",&m,&n);
47:
48: findCombination(n,m);
49:
50: getchar();
51: return 0;
52: }
*****************************************************************************
子问题一: 在n个数的数列,我们取n, 然后原问题就变为找出1,2,...,n-1中和为m-n的所有子集,然后将所有的子集都加上元素n就得到了原问题的部分解集;
子问题二: 我们不取n, 原问题就变为找出1,2,...,n-1中和为m的所有子集.
联合两个子问题的解, 便得到了原问题的解集.
#include <stdio.h>
#include <assert.h>
#include <time.h>
#define MAXN 1000
int stack[MAXN];
int top = -1;
void push( int e )
{
}
void pop( )
{
}
void clear()
{
}
void printStack( )
{
}
int subsets( int n, int m )
{
}
void testSubsets()
{
}
int main()
{
}