“n个球放入m个盒子,使用程序输出所有的放法”的c++回溯法

前言:

问题描述:

有n个相同的球,m个盒子(编号为1,2,……m),将这n个球放入这m个盒子中,要求输出所有可能的放置方法,输出格式为二维数组(如下例子),每行对应每个可能性,每列对应每个盒子中的球数。
例如:3个球,5个盒子,可能的放法有:
30000
21000
11100
10101
……等

原问题来源:

点击打开链接


写了个C++回溯法

#include
using namespace std;
void Select(int i,int j,const int m,int *x,int &num){//i为第i个盒子。0<=i<=m-1。j是剩余球数。x为放置球的解法,num可有可无,记录放置的方法数目。
	if (i > m)
		return;
	if (j == 0){
		num++;
		cout << "x可行序列为 : (";
		for (int i = 0; i < m; i++){
			cout << x[i];
			if (i != m - 1)
				cout << ",";
			else
				cout << ")" << endl;
		}
		return;
	}
	for (int k = j; k >= 0; k--){
		if (i == m)
			return;
		x[i] = k;
		Select(i + 1, j - k, m, x,num);
		x[i] = 0;
	}
}
int main(){
	int num = 0;
	int m = 5, n = 3;
	int x[5] = { 0 };
	Select(0, n, m, x,num);
	cout << "共 " << num << "种" << endl;
	return 0;
}


你可能感兴趣的:(c++笔记)