Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   перебор всех сумм n-го количества членов массива (http://www.flasher.ru/forum/showthread.php?t=142033)

iNils 11.07.2010 01:44

Согласен с Nirth, при максимальном числе труб 24 при выборе из 30 труб, получится 30^24 = 2,82429536481e+35 вариантов.

-De- 11.07.2010 06:30

Да строит оно трубу на 100км за полсекунды на флэше и не жужжит. Зачем сервер нагружать?

Elff 11.07.2010 19:25

-De-, iNils, спасибо за помощь :drinks:

Остановился пока на таком варианте, надо будет доработать потом...
Код AS3:

var my_length:int = 2500; // 25 м
var cut_Ar:Array = [102,110,120,125,127,131,137,143,161,176,199,200,250,256,277,300,321,349,351,380,385,387,390];
var index_Array:Array = []; // массив с индексами нужных длин в массиве cut_Ar
var ind:int = cut_Ar.length-1;
var limit:int = 10; // допуск
function rundown():void {
        var max_cutAr:int = cut_Ar[ind];
        var min_numPipe:uint = Math.ceil(my_length/max_cutAr); // минимальное количество труб
        for (var j:int = ind; j>=0; j--) {
                if (min_numPipe<=ind) {
                        var long:int = cut_Ar[j];
                        var long_minus:int = cut_Ar[j-1];
                        if (long<my_length+limit) {
                                my_length-=long;
                                index_Array.unshift(j);
                        }
                        if (my_length<=limit && my_length>=-limit) {
                                trace("метраж: " + Number(2500-my_length))
                                for (var q:int=0; q<index_Array.length; q++) {
                                        trace(cut_Ar[index_Array[q]])
                                }
                                //break;
                        }
                        if (my_length<long_minus-limit) {
                                my_length+=long;
                                index_Array.splice(0,1);
                        }
                        if (my_length<=limit && my_length>=-limit) {
                                trace("метраж: " + Number(2500-my_length))
                                for (var q2:int=0; q2<index_Array.length; q2++) {
                                        trace(cut_Ar[index_Array[q2]])
                                }
                                //break;
                        }
                        if (j==0) {
                                index_Array = [];
                                my_length = 2500;
                                ind--;
                                rundown();
                        }
                } else {
                        break;
                }
        }
}
rundown();

Цитата:

Сообщение от -De- (Сообщение 921325)
ссылка (можно в личку) на риальнэ трубопродавальный сайт =)

Серьезно?:) могу написать, только сайт мягко говоря убогенький

Котяра 11.07.2010 23:53

ужасные наименования. глаза ломает.
Код AS3:

max_cutAr
cut_Ar
index_Array

вы уж определитись со стилем..

-De- 12.07.2010 00:08

Не интересно с допуском!
Вот, раз уж я накидал, чтоб посмотреть, за сколько же оно считает, мож пригодится.
Код AS3:

                public var C:Array = [102, 120, 125, 127, 131, 133, 139, 143, 160, 177, 199, 250, 256, 277, 321, 349, 351, 385, 387, 390];
                public var sum:int = 100009;
                public var A:Array;
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        A = new Array(sum + 1);
                        A[0] = 0;
                        C.sort(2);//сортируем по убыванию, чтоб самые длинные трубы использовались чаще всего
                        for (var i:int = 0; i < C.length; ++i) {
                                for (var j:int = 0; j <= sum - C[i]; ++j) {
                                        if (A[j] != null && A[j + C[i]] == null) {
                                                A[j + C[i]] = C[i];
                                                if (j + C[i] == sum) {
                                                        printTubes();
                                                        return;
                                                }
                                        }
                                }
                        }
                        trace("not found");
                }
                private function printTubes():void {
                        var count:int = 0;
                        for (var i:int = sum; i > 0; i -= A[i]) {
                                count += A[i];
                                trace("труба длиной "+A[i]+" метраж "+count);
                        }
                        A = null;
                        //trace(count);
                }

Ссылка на сайт интересна в плане, что не олимпиада какая.


Часовой пояс GMT +4, время: 12:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.