输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来

/*
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
*/

#include "stdafx.h"
#include<iostream>
#include<vector>
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)
	{
		//将n集合中值为n的元素的flag制为1
		flag[n - 1] = 1;
		PrintSolutions(flag);
		flag[n - 1] = 0;
	}
	//最高位制为1
	//F(sum,n)=F(sum-n,n-1)+F(sum,n-1);
	//n个元素凑sum等价于
	//n-1个元素凑sum-n(这部分说明原先有n参与才凑成sum)
	//和n-1个元素凑sum(这部分说明原先没有n参与也能凑成sum)
	flag[n - 1] = 1;
	BagProblem(m - n, n - 1, flag);
	flag[n - 1] = 0;
	BagProblem(m, n - 1, flag);
}

int main()
{
	int m=0, n=0;
	cout << "Please input the m and n:" << endl;
	cin >> m >> n;
	cout << "The solution is:" << endl;
	length = n;
	//创建大小为n的数组flag
	int *flag = (int *)malloc(sizeof(int)*n);
	memset(flag, 0, sizeof(flag));
	BagProblem(m, n, flag);
	free(flag);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_29996285/article/details/79762107