实际上就是一个背包问题。
求解思路:
1.首先判断,如果n>m,则n中大于m的数不可能参与组合,此时置n = m;
2.如果n == m满足条件则将最大数n加入,输出一种组合;
3.将n分两种情况求解,(1)n加入,取n = n - 1, m = m - n,递归下去;(2)n没有加入,取n = n - 1; m = m;递归下去
#include "stdafx.h"
#include <iostream>
using namespace std;
int length;
void PrintSolutions(int *flag)
{
for (int i=0; i<length; i++)
{
if (flag[i] == 1)
{
cout << i+1 << " ";
}
}
cout << endl;
}
void BagProblem(int m, int n, int *flag)
{
if(n<1 || m<1)
return;
if(m < n)
n = m;
if (n == m)
{
flag[n-1] = 1;
PrintSolutions(flag);
flag[n-1] = 0;
}
flag[n-1] = 1;
BagProblem(m-n, n-1, flag);
flag[n-1] = 0;
BagProblem(m, n-1, flag);
}
int main(int argc, char* argv[])
{
int m, n;
cout << "Please input the m and n:" << endl;
cin >> m >> n;
cout << "The solution is:" << endl;
length = n;
int *flag = (int *)malloc(sizeof(int)*n);
memset(flag, 0, sizeof(flag));
BagProblem(m,n,flag);
//delete flag;//这个地方犯了一个原则性的错误 new和delete成对使用, malloc应该和free成对使用,要不然就会造成内存泄露
free(flag);
return 0;
}