Tema: Esquema de Distribución de Dulces
Tema Descripción
Ahora hay n dulces distribuidos equitativamente entre n personas, y el número de dulces para cada persona puede ser 0. Encuentre todas las asignaciones posibles.
ingresar
Un entero positivo n que denota el número de dulces y el número de personas a distribuir.
producción
Muestra los distintos esquemas de asignación posibles, un esquema por línea, y cada número está separado por un espacio.
ejemplo
ingresar:
3
producción:
0 0 3
0 1 2
0 2 1
0 3 0
1 0 2
1 1 1
1 2 0
2 0 1
2 1 0
3 0 0
Soluciones
Podemos usar un método recursivo para generar todas las posibles asignaciones de caramelos. Para cada persona, iteramos sobre la cantidad de dulces que podría obtener (de 0 a la cantidad de dulces que quedan), y luego recursivamente llamamos a la función para tratar con las personas restantes y la cantidad de dulces que quedan.
Código
#include <iostream>
#include <vector>
using namespace std;
// 递归生成所有糖果分配方案
void generateDistributions(int candies, int people, vector<int>& distribution)
{
// 如果只剩下一个人,则将剩余的糖果数量加入分配方案中,输出当前方案,并弹出向量中的元素
if (people == 1)
{
distribution.push_back(candies);
// 输出当前的分配方案
for (int i = 0; i < distribution.size(); i++)
{
cout << distribution[i];
if (i != distribution.size() - 1)
cout << " ";
}
cout << endl;
distribution.pop_back();
return;
}
// 第一个人获得的糖果数量从0到candies递增
for (int i = 0; i <= candies; i++)
{
distribution.push_back(i);
// 递归调用函数来分配剩余的糖果数量给其他人
generateDistributions(candies - i, people - 1, distribution);
distribution.pop_back();
}
}
int main()
{
int n;
cin >> n;
vector<int> distribution;
// 调用函数生成糖果分配方案
generateDistributions(n, n, distribution);
return 0;
}
explicar y discutir
En este problema, usamos un enfoque recursivo para generar todas las posibles asignaciones de caramelos. Al recorrer la cantidad posible de dulces para cada persona y procesar recursivamente las personas restantes y la cantidad de dulces restantes, podemos encontrar todas las soluciones.
En el código, definimos una generateDistributions
función para realizar la recursividad. Usamos un vector ( distribution
) para almacenar la asignación actual.
Para cada paso recursivo, primero verificamos si solo queda una persona. En caso afirmativo, agregue el número restante de dulces distribution
a , emita la asignación actual y extraiga los elementos en el vector. De lo contrario, itere a través de la cantidad de dulces que la primera persona podría obtener y llame recursivamente a la función para tratar con los demás y los dulces restantes.
En la función principal, leemos la cantidad de dulces de entrada y el número de personas, y llamamos generateDistributions
a la función para generar el plan de distribución de dulces.
Finalmente, lo encapsulamos en una función.
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
// 递归生成所有糖果分配方案
vector<vector<int>> generateDistributions(int candies, int people)
{
vector<vector<int>> result;
vector<int> distribution;
// 嵌套函数用于递归生成糖果分配方案
function<void(int, int)> generate = [&](int candies, int people) {
// 如果只剩下一个人,则将剩余的糖果数量加入分配方案中,输出当前方案,并弹出向量中的元素
if (people == 1)
{
distribution.push_back(candies);
result.push_back(distribution);
distribution.pop_back();
return;
}
// 第一个人获得的糖果数量从0到candies递增
for (int i = 0; i <= candies; i++)
{
distribution.push_back(i);
// 递归调用函数来分配剩余的糖果数量给其他人
generate(candies - i, people - 1);
distribution.pop_back();
}
};
// 调用嵌套函数生成糖果分配方案
generate(candies, people);
return result;
}
int main()
{
int n;
cin >> n;
vector<vector<int>> distributions = generateDistributions(n, n);
// 输出糖果分配方案
for (int i = 0; i < distributions.size(); i++)
{
for (int j = 0; j < distributions[i].size(); j++)
{
cout << distributions[i][j];
if (j != distributions[i].size() - 1)
cout << " ";
}
cout << endl;
}
return 0;
}