У меня проблема с рекурсивным решением задачи суммирования. Проблема заключается в следующем: для заданных m и n составьте программу, которая будет суммировать n чисел до m так, чтобы использовались минимальные числа, а они есть. Если существует несколько решений, правильным будет то, которое использует большие числа. Пользователь вводит n, m и n чисел. Например: m=19 n=4 8,5,4,1 . Решение 8+5+5+1. если я вызову функцию со следующим числом в массиве и добавлю его, пока оно меньше суммы, решение будет найдено, только если следующие числа в массиве могут суммироваться до m. Если проблема такова: m=28 n=3 8,7,5 Решение 8+8+7+5, но моя программа пойдет 8+8+8 и попытается добавить 7 или 5 и вылетит, потому что нет из них может поместиться до 28. Итак, моя проблема заключается в том, чтобы вернуться более чем на 2 шага назад. Я могу перейти от 8+8+8+7 к 8+8+8, но не могу вернуться к 8+8. Это похоже на задачу о рюкзаке, только проще. Извините, что пока не включил мой код:
#include <iostream>
#include <vector>
using namespace std;
void outputt(vector<int>);
int x(int m,vector<int> s,int n,int u)
{
static int sum=0;
static int level=0;
static vector<int> p;
sum+=s[u];
p.push_back(s[u]);
if(level==((n-u)+1))
{
p.pop_back();
level=0;
x(m,s,n,u-1);
}
if(sum>m)
{
level++;
sum-=s[u];
p.pop_back();
x(m,s,n,u+1);
}
if(sum==m)
{
outputt(p);
return sum;
}
else
x(m,s,n,u);
level++;
if(level>n-1)
outputt(p);
if(sum==m)
return sum;
else
{
cout<<"....";
x(m,s,n,level);
}
}
void outputt(vector<int> x)
{
for(vector<int>::iterator i=x.begin();i!=x.end();++i)
cout<<*i<<" ";
}
int main()
{
int m,n;
cin>>m>>n;
int z;
vector<int> p;
for(int i=0;i<n;++i)
{
cin>>z;
p.push_back(z);
}
cout<<x(m,p,n,0);
system("PAUSE");
}
Есть проблема с выводом, но сейчас это не важно.