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

简介: /*输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来*/#include "stdafx.
/*
输入两个整数 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;
}


相关文章
定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
219 0
1245:不重复地输出数 2020-12-28
1245:不重复地输出数 2020-12-28
计算一个数的每位之和(递归) 例如,用函数DigitSum(1729),则返回1+7+2+9,和为19 输入1729,输出19
计算一个数的每位之和(递归) 例如,用函数DigitSum(1729),则返回1+7+2+9,和为19 输入1729,输出19
113 0
计算一个数的每位之和(递归) 例如,用函数DigitSum(1729),则返回1+7+2+9,和为19 输入1729,输出19
编写输出1~100之间的素数,要求每行显示5个数
编写输出1~100之间的素数,要求每行显示5个数
|
机器学习/深度学习 C语言
设计求m值以内的勾股数组(按x从小到大输出,每行输出3组)-C语言
设计求m值以内的勾股数组(按x从小到大输出,每行输出3组)-C语言
168 0
有一个数列(1)循环输出数列的值(2)求数列中所有数值的和(3)猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含次数
有一个数列(1)循环输出数列的值(2)求数列中所有数值的和(3)猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含次数
270 0
|
Python
编写程序,输入若干整数(整数之间以逗号间隔),统计每个整数的出现次数。
编写程序,输入若干整数(整数之间以逗号间隔),统计每个整数的出现次数。
226 0
编写程序,输入若干整数(整数之间以逗号间隔),统计每个整数的出现次数。
【PTA】查找满足条件的最后一个整数 (15分)
【PTA】查找满足条件的最后一个整数 (15分)
856 0