Есть следующая задача.
Есть 6 файлов, их нужно разослать по 4м каналам, как можно быстрее ( интенсивней )
Вот пример алгоритма.
Проблема в том, что в моей реализации, он ходит на 1 уровне в значение 1, а потом не возвращается опять на 1ый уровень в ветку со значением 0. Помогите пофиксить
Вот реализация:
Код:
//
// main.cpp
// Additive
//
// Created by MacBook Pro on 23.11.12.
// Copyright (c) 2012 Vyacheslav Tsurka. All rights reserved.
//
// TODO: Add checkLevel function
#include <iostream>
#include <vector>
using namespace std;
struct info {
std::vector<float> input;
float constrains;
};
std::vector<float> next(info params, std::vector<float> candiates);
std::vector<float> first(info params, std::vector<float> candiates);
bool reject(info params, std::vector<float> set);
bool accept(info params, std::vector<float> set);
float getPathSummary(info params, std::vector<float> set);
int backtrack(info params, std::vector<float> set);
int main(int argc, const char * argv[])
{
info data;
memset(&data, 0, sizeof(info));
data.input = {0, 4, 0.5,0.7};
data.constrains = 2;
//std::cout << data.constrains << endl;
std::vector<float> root = {1};
backtrack(data, root);
return 0;
}
int backtrack(info params, std::vector<float> set)
{
if (reject(params, set)) {
return 0;
}
if (accept(params, set)) {
std::cout << "Accepted" << getPathSummary(params, set) << endl;
}
set = first(params,set);
while(set.size() != 0) {
backtrack(params, set);
set = next(params,set);
}
return 1;
}
/**
* Проходит ли кандидат условия
*/
bool reject(info params, std::vector<float> set)
{
float sizes = 0;
for (int i = 0; i < set.size(); i++) {
sizes += params.input[i] * set[i];
}
bool isRejected = ((sizes > params.constrains) || (params.input.size() < set.size())) ? true : false;
std::cout << "Reject check:" << isRejected << endl;
return isRejected;
}
bool accept(info params, std::vector<float> set)
{
return true;
}
/**
* Получить значение по пути
*/
float getPathSummary(info params, std::vector<float> set)
{
float summary = 0;
for (int i =0; i < set.size(); i++) {
summary += params.input[i] * set[i];
}
return summary;
}
/**
* Значение первого кандидата
*/
std::vector<float> first(info params, std::vector<float> candiates)
{
int l = (int) candiates.size();
if (l > params.input.size()) {
std::vector<float> tmp;
std::cout << "First return empty vector" << endl;
memset(&tmp,0,sizeof(float));
return tmp;
} else {
std::cout << "First path inc" << endl;
candiates.push_back(1);
return candiates;
}
}
std::vector<float> next(info params, std::vector<float> candiates)
{
int l = (int) candiates.size();
if (l > params.input.size()) {
std::vector<float> tmp;
memset(&tmp,0,sizeof(float));
return tmp;
} else {
std::cout << "Next path inc" << endl;
candiates.push_back(0);
return candiates;
}
}