Алгоритмизация 17.12.2015 / 15:40 | | aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Ну условие вроде не сложное, просто сгенерировать последовательность, сумма чисел которой будет равна n, при том, что на каждом шаге мы можем прибавлять от 1 до k включительно. Вот ещё примеры: in: n = 10, k = 3 out: 3 3 3 1 3 3 2 2 2 2 2 2 2 1 2 3 3 1 1 1 1 1 1 1 1 1 1 1 и т.д., тут много можно комбинаций составить in: n = 4, k = 1 out: 1 1 1 1 in: n = 3, k = 3 out: 1 1 1 1 2 2 1 Надеюсь, я понял правильно задание, а то только запутаю Пройтись в цикле, контролируя сумму. __________________
let live Изменено aNNiMON (17.12 / 15:41) (всего 1 раз) |
17.12.2015 / 16:19 | | Askalite Пользователь Сейчас: Offline
Имя: Аскалайт Регистрация: 12.10.2011
| Так, эта задача сводиться к перебору всех чисел меньше k, дающих в сумме n, в случае если он прыгает только с начальной клетки и только в одну сторону? Поскольку в твоём условии могут и быть такие варианты: +2,-1,... И так до бесконечности.
Задача о сумме подмножеств... public int N,K; public void F(int v, int s){ s+=v; if (s!=N) System.out.print(s+" "); else { System.out.println(s); return; } for(int i=v;i<=K;i++)F(i,s); }
main(){ F(1,0); }
Правда код написан на коленке и я не уверен... Проверьте пожалуйста.
|
17.12.2015 / 16:21 | | Dinisimys Пользователь Сейчас: Offline
Имя: Денис Регистрация: 30.07.2012
| aNNiMON, да где в этом условие говориться, что должна быть сумма всегда равна эн. Не знаю, но мне это условие как сингулярность черной дыры - нифига не понятно. Но по ауту я думал , что надо перебрать все комбины с числами К, 1 и 0, но так понял не все так просто. Числа должны быть от 0 до К. Но блин, где такое сказано, сказали, что кенгуру прыгает на К клеток, все. Ну кароче не та у меня логика
|
17.12.2015 / 16:42 | | Askalite Пользователь Сейчас: Offline
Имя: Аскалайт Регистрация: 12.10.2011
| Dinisimys, короче, я убрал все ошибки:
//Примерное решение на java
public void F(int v, int s){ s+=v; if (s!=N) System.out.print(s+" "); else { System.out.println(s); return; } for(int i=1;i<=K;i++)F(i,s); }
public static int N,K;
main(){//Типа точка запуска for(int i=1;i<=K;i++)F(i,0); }
Берётся начальная точка в цикле и из неё шагаем поочерёдно на расстояние v, до тех пор пока вес s, не станет равным N. Короче, это более менее сильно мне напоминает разветвляющееся дерево, части которого перебираются в рекурсивном цикле. Отображаються все обрезанные ветви, которые если пройти от начала и суммировать все встречающиеся узлы v, то получиться N.
В общем, я не знаю что это за печенька и не знаю как она работает и работает ли вообще. Сам проверяй.
|
17.12.2015 / 17:12 | | Askalite Пользователь Сейчас: Offline
Имя: Аскалайт Регистрация: 12.10.2011
| Упс... Ещё одна ошибка. public void F(int v, int s){
if(s>N)return;
s+=v;
if (s!=N) System.out.print(s+" ");
else {
System.out.println(s);
return;
}
for(int i=1;i<=K;i++)
F(i,s);
}
public static int N,K;
main(){//Типа точка запуска
for(int i=1;i<=K;i++) F(i,0);
}
Изменено aNNiMON (17.12 / 18:02) (всего 2 раза) |
17.12.2015 / 17:30 | | Oak Пользователь Сейчас: Offline
Имя: Коля Откуда: Москва Регистрация: 02.06.2010
| Askalite, убирай весь код в специальный тег code. Он есть на панельке. Буду банить.
Длинные коды также убирай под спойлер.
__________________
Эль Презеденте |
17.12.2015 / 17:39 | | Dinisimys Пользователь Сейчас: Offline
Имя: Денис Регистрация: 30.07.2012
| Askalite, Протестировал код, выдало просто 1 2 3 4 5 6 для Н=5, К=2
|
17.12.2015 / 18:22 | | aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Вот набросал. http://ideone.com/I4s3hXНо ещё реверсы нужны. Открыть спойлер Закрыть спойлер public class Main {
public static void main(String[] args) {
calc(5, 2);
}
public static void calc(int n, int k) {
for (int i = 1; i <= k; i++) {
process(i, n, k);
}
}
public static void process(int startWith, int n, int k) {
for (int i = 1; i <= k; i++) {
processNext(startWith, i, n, k);
}
}
public static void processNext(int startWith, int nextWith, int n, int k) {
int sum = startWith;
System.out.print(startWith + " ");
while (sum < n) {
int step = nextWith;
if (sum + step > n) {
step = (sum + step) % n;
}
System.out.print(step + " ");
sum += step;
}
System.out.println();
}
}
__________________
let live Изменено aNNiMON (17.12 / 18:24) (всего 1 раз) |
17.12.2015 / 18:33 | | Dinisimys Пользователь Сейчас: Offline
Имя: Денис Регистрация: 30.07.2012
| Открыть спойлер Закрыть спойлер function out() {
for(t=0;t<n;t++) {
document.write(m[t]+" ")
}
document.write("<br>")
}
function summa() {
s=0
for(t=0;t<n;t++) {
s+=m[t]
}
return s
}
n=5
k=2
m=array(n)
for(h=0;h<n,summa()>=n;h++) {
for(j=1;j<=k;j++){
m[h]=j
for(g=h+1;g<n,summa()>=n;g++){
m[g]=1
}
out()
}
}
Код на яваскрипте. Почему не пашет? тестировал через телефоне на jsfiddle, ничего не выводит. Подскажите Изменено Dinisimys (17.12 / 18:35) (всего 1 раз) |
17.12.2015 / 20:01 | | Askalite Пользователь Сейчас: Offline
Имя: Аскалайт Регистрация: 12.10.2011
| Вот как-то так. Открыть спойлер Закрыть спойлер import java.util.*;
public class Main
{
public static LinkedList<Integer> list=new LinkedList<Integer>();
public static String buff="";
public static int N=5,K=2;
public static void main(String[] args)
{
for(int i=1;i<=K;i++)Func(i,0);
}
public static void Func(int v, int s){
list.add(v);
if (s+v>N){
list.removeLast();
return;
}
if (s+v==N){
System.out.println(list.toString());
list.removeLast();
return;
}
for(int i=1;i<=K;i++)Func(i,s+v);
list.removeLast();
}
}
|
Всего сообщений: 127 Фильтровать сообщения Поиск по теме Файлы топика (2)
|