|
туплю ... общий алгоритм | ☑ | ||
---|---|---|---|---|
0
lamme
05.11.13
✎
16:34
|
Есть некая сумма. Скажем 30 000
Есть некая ТЗ с колонкой Сумма. Строк - неограниченное кол-во. Надо выбрать строки (перебор с верху вниз) на сумму 30 000 То что выбрано - или удалить или обнулить сумму в строке та строка которая с остатком - ну в нее вывести остаток ... |
|||
1
lamme
05.11.13
✎
16:35
|
знаю - что элементарно .. но чего то пиндыр ...
|
|||
2
Быдло замкадное
05.11.13
✎
16:36
|
перебором...
|
|||
3
Ksandr
05.11.13
✎
16:36
|
НайтиСтроки
|
|||
4
Ksandr
05.11.13
✎
16:36
|
а, не правильно понял. Перебором проще всего. Можно запрос с нарастающим итогом
|
|||
5
Быдло замкадное
05.11.13
✎
16:37
|
процедуры ПеребратьСНизуВверхОбнулениеДоПредела в платформе точно нет
|
|||
6
МихаилМ
05.11.13
✎
16:37
|
||||
7
pessok
05.11.13
✎
16:38
|
Сумма = 0;
МассивСтрок = Новый Массив; ит = Тч.количество()-1 Пока Сумма <= 30000 Цикл МассивСтрок.Добавить(тч[ит]); сумма = сумма = тч[ит]; ит = ит + 1; КонецЦикла; |
|||
8
Пенза58
05.11.13
✎
16:38
|
(0) Сумма должна быть ровно 30000 ?
или когда сумма строк будет больше 30000? |
|||
9
pessok
05.11.13
✎
16:38
|
сумма = сумма + тч[ит] есессно
|
|||
10
pessok
05.11.13
✎
16:38
|
мля :) тч[ит].сумма;
пора домой, сложный вторнедельник |
|||
11
Пенза58
05.11.13
✎
16:38
|
сумма = сумма + тч[ит].сумма
|
|||
12
lamme
05.11.13
✎
16:39
|
уху .. делаю перебором
НекаяЗакрСумма=30000; для каждого Стр из ТаблицаЗадолженностей_Копия цикл СуммаТЧ = Стр.Сумма; ОстатокОтЗакрСуммы = НекаяЗакрСумма -СуммаТЧ Стр.Сумма = 0; // обнуляем ту строку кот уже использована Если СуммаТЧ<=0 тогда Стр.Сумма = ОстатокОтЗакрСуммы прервать конецесли; конеццикла; |
|||
13
pessok
05.11.13
✎
16:39
|
(11) угу, и ит = ит - 1;
|
|||
14
lamme
05.11.13
✎
16:39
|
(8)
когда больше. ровно - это идеально .. но такого редко |
|||
15
pessok
05.11.13
✎
16:40
|
(14) см (7) + (10)/(11) + (13)
|
|||
16
lamme
05.11.13
✎
16:42
|
(15)
гы уху |
|||
17
Serg_1960
05.11.13
✎
16:42
|
Хмм...не так всё просто. Порядок строк важен (точнее - суммы, которые в этих строках). И если нужно минимизировать остаток - вопрос о порядке подбора/отбора строк становится первоочередным и принципиальным.
|
|||
18
pessok
05.11.13
✎
16:42
|
(17) ТЧ.Сортировать("Сумма Убыв")?
|
|||
19
Serginio1
05.11.13
✎
16:43
|
Можно сначала выбрать бинарным поиском на меньше или равно на нужное значение до тех пор пока сумма будет меньше нужной.
|
|||
20
Serginio1
05.11.13
✎
16:45
|
Но вообще это задача рюкзака
wiki:%C7%E0%E4%E0%F7%E0_%EE_%F0%E0%ED%F6%E5 |
|||
21
lamme
05.11.13
✎
16:46
|
(20)
чего так сложно то ... |
|||
22
Serginio1
05.11.13
✎
17:03
|
(21) Ну попробуй для начала 19. Это для 7 ки. Приложи его для 8 ки. (Нумерация с 0 по Количество()-1 )
Функция НайтиЗначениеПоловиннымДелением(Тз,Цена) Левое=1; Правое=Тз.КоличествоСтрок(); Пока 1=1 Цикл Вычитаемое=Макс(Цел((Правое-Левое)/2),1); Середина=Правое-Вычитаемое; РасчетнаяЦена= Тз.ПолучитьЗначение(Середина,"Цена"); if Цена<РасчетнаяЦена then Правое=Середина else Левое=Середина; КонецЕсли; if Цена=РасчетнаяЦена Тогда Тз.ПолучитьСтрокуПоНомеру(Середина); возврат Середина КонецЕсли; Если (Правое-Левое)<=1 Тогда Прервать; КонецЕсли; КонецЦикла; Тз.ПолучитьСтрокуПоНомеру(левое); Возврат левое; КонецФункции // НайтиЗначениеПоловиннымДелением |
|||
23
Serginio1
06.11.13
✎
10:29
|
22 Да там нужно сделать еще краевую проверку
Если Правое=Тз.КоличествоСтрок() Тогда Если Тз.ПолучитьЗначение(Правое,"Цена")<=Цена Тогда Тз.ПолучитьСтрокуПоНомеру(правое); возврат правое КонецЕли; КонецЕли; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |