C ++递归:查找具有不同价格的所有可能的产品购买组合

时间:2018-01-28 22:35:53

标签: c++ recursion subset-sum

假设我有n笔钱,而A项费用为1,B项费用为2,C项费用为3。

如何以一定金额打印所有可能的购买组合?

n = 3的输出应如下所示:C - A,B - B,A - A,A,A

我想出的解决方案很遗憾没有用。

void purchase(int money)
{
    if (money == 0)
    {
        return;
    }
    else
    {
        if (money > 3)
        {
            cout << "C ";
            purchase(money - 3);
        }
        else if (money > 2)
        {
            cout << "B ";
            purchase(money - 2);
        }
        else if (money == 1)
        {
            cout << "A ";
        }
    }
}

2 个答案:

答案 0 :(得分:0)

使用支持缓冲区和缓冲区功能,可以轻松实现此操作。这里str用作缓冲区,我保存到目前为止遇到的字母,而depth用于保持关卡。

void purchase_impl(int money, char * str, int depth) {
    if (money == 0) {
        if (depth > 0) {
            str[depth] = '\0';
            std::cout << str << std::endl;
        }
        return;
    }
    if (money >= 3) {
        str[depth] = 'C';
        purchase_impl(money-3, str, depth+1);
    }
    if (money >= 2) {
        str[depth] = 'B';
        purchase_impl(money-2, str, depth+1);
    }
    if (money >= 1) {
        str[depth] = 'A';
        purchase_impl(money-1, str, depth+1);
    }
}

void purchase(int money)
{
    char * str = (char *) malloc(money+1);
    purchase_impl(money, str, 0);
    free(str);
}

答案 1 :(得分:0)

您需要跟踪您的路径,并测试正确的值并包括所有可能性。

function getClientes(){
let listaClientes = JSON.parse(localStorage.getItem('listaClientesLS'));
let clientes = [];

if (listaClientes == null) {
    clientes = [];
} else{
    listaClientes.forEach(obj =>{

        let objCliente = new Cliente(obj.nombre, obj.apellido1, obj.apellido2, obj.cedula, obj.telefono, obj.email);

        obj.listaVehiculos.forEach(objVehiculoTemp => {
          let objVehiculo = new Vehiculo(objVehiculoTemp.matricula,objVehiculoTemp.marca,objVehiculoTemp.modelo,objVehiculoTemp.anno,objVehiculoTemp.capacidad,objVehiculoTemp.kilometraje);

          objCliente.agregarVehiculo(objVehiculo);

        });

        clientes.push(objCliente);
    })
}

return clientes;

此解决方案列出了所有可能的购买,包括不会耗尽现金供应的购买。