Esquema de distribución de dulces

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 generateDistributionsfunció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 distributiona , 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 generateDistributionsa 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_51447496/article/details/132367490
Recomendado
Clasificación