Какие страсти вызвал казалось бы простой коинченьдж :)
Поправьте, пжл, меня или код.
Хорошо, вот вам новый кот - выводит все рассчитанные варианты и можно играться параметрами. Только сильно большие числа не задавайте - он ведь честно будет
песнь заводить, идя налево все варианты выводить :)
int r[100];
bool s(int i) { return r[i] && cout<<r[i]<<'\t' && s(i+1); }
int show() { s(1); cout<<'\n'; return 0; }
int f(int s, int i, int k) {
r[k]=i;
return (s<0 || i<=0 || k<0) ? 0 : (s==0 && k==0) ? 1 + show() : f(s-i, i, k-1) + f(s, i-1, k);
}
int main() {
int s=9, n=3, k=5; // играться параметрами здесь
cout << "первый вариант трактовки условия: " << f(s, n, k) << "\n\n";
r[k]=n;
cout << "второй вариант трактовки условия: " << f(s-n, n, k-1) << "\n\n";
}
Код:
1 1 1 3 3
1 1 2 2 3
1 2 2 2 2
первый вариант трактовки условия: 3
1 1 1 3 3
1 1 2 2 3
второй вариант трактовки условия: 2
ЗЫ, да, уточню на всякий случай - считаю без нулевых слагаемых (хотя кот только упростится, если их разрешить), вариант №2 требует обязательного присутствия хотя бы одного слагаемого равного n - т.к. Арнольд неоднозначно сформулировал условие.