SHOW:
|
|
- or go back to the newest paste.
| 1 | - | # |
| 1 | + | # |
| 2 | - | # Имеется груз массой massa и набор весов, указанных в таблице |
| 2 | + | # Имеется груз массой massa и набор весов, указанных в таблице |
| 3 | - | # |
| 3 | + | # |
| 4 | - | # create table m ( n int unsigned not null auto_increment, value int not null, primary key(n) ); |
| 4 | + | # create table m ( n int unsigned not null auto_increment, w int not null, primary key(n) ); |
| 5 | - | # |
| 5 | + | # insert into m values (NULL, 3), (NULL, 5), (NULL, 4); |
| 6 | - | # где n - порядковый номер веса (без разрывов), |
| 6 | + | # |
| 7 | - | # value - вес |
| 7 | + | # где n - порядковый номер веса (без разрывов), w - вес |
| 8 | - | # |
| 8 | + | # |
| 9 | - | # Можно ли указанными в таблице весами взвесить груз массой massa? |
| 9 | + | # Можно ли указанными в таблице весами взвесить груз массой massa? |
| 10 | - | # |
| 10 | + | # |
| 11 | - | # see http://www.youtube.com/watch?v=O97NBMlXAvc |
| 11 | + | # see http://www.youtube.com/watch?v=O97NBMlXAvc |
| 12 | - | # |
| 12 | + | # |
| 13 | - | |
| 13 | + | |
| 14 | - | DELIMITER $$ |
| 14 | + | DELIMITER $$ |
| 15 | - | |
| 15 | + | |
| 16 | - | DROP function IF EXISTS can_calc_weight$$ |
| 16 | + | DROP function IF EXISTS can_calc_weight$$ |
| 17 | - | CREATE function can_calc_weight (massa INT UNSIGNED) |
| 17 | + | CREATE function can_calc_weight (massa INT UNSIGNED) |
| 18 | - | RETURNS INT UNSIGNED |
| 18 | + | RETURNS INT UNSIGNED |
| 19 | - | BEGIN |
| 19 | + | BEGIN |
| 20 | - | DECLARE k INT UNSIGNED; |
| 20 | + | DECLARE k INT UNSIGNED; |
| 21 | - | DECLARE max_k INT UNSIGNED; |
| 21 | + | DECLARE max_k INT UNSIGNED; |
| 22 | - | DECLARE result INT UNSIGNED; |
| 22 | + | DECLARE result INT UNSIGNED; |
| 23 | - | |
| 23 | + | |
| 24 | - | insert into h values (0); |
| 24 | + | insert into h values (0); |
| 25 | - | |
| 25 | + | |
| 26 | - | set max_k = (select max(n) from m); |
| 26 | + | set max_k = (select max(n) from m); |
| 27 | - | set k = 1; |
| 27 | + | set k = 1; |
| 28 | - | |
| 28 | + | |
| 29 | - | while k <= max_k do |
| 29 | + | while k <= max_k do |
| 30 | - | insert into g select DISTINCT h.i + t.value |
| 30 | + | insert into g select DISTINCT h.i + t.w |
| 31 | - | from h, |
| 31 | + | from h, |
| 32 | - | ( select m.value |
| 32 | + | ( select m.w |
| 33 | - | from m |
| 33 | + | from m |
| 34 | - | where n=k |
| 34 | + | where n=k |
| 35 | - | union |
| 35 | + | union |
| 36 | - | select -m.value |
| 36 | + | select -m.w |
| 37 | - | from m |
| 37 | + | from m |
| 38 | - | where n=k ) as t; |
| 38 | + | where n=k ) as t; |
| 39 | - | |
| 39 | + | |
| 40 | - | |
| 40 | + | |
| 41 | - | insert ignore into h select * from g; |
| 41 | + | insert ignore into h select * from g; |
| 42 | - | DELETE FROM g; |
| 42 | + | DELETE FROM g; |
| 43 | - | set k = k + 1; |
| 43 | + | set k = k + 1; |
| 44 | - | end while; |
| 44 | + | end while; |
| 45 | - | |
| 45 | + | |
| 46 | - | set result = IF(massa IN (select h.i from h where h.i>0), 1, 0); |
| 46 | + | set result = IF(massa IN (select h.i from h where h.i>0), 1, 0); |
| 47 | - | DELETE FROM h; |
| 47 | + | DELETE FROM h; |
| 48 | - | RETURN result; |
| 48 | + | RETURN result; |
| 49 | - | END$$ |
| 49 | + | END$$ |
| 50 | - | |
| 50 | + | |
| 51 | - | DELIMITER ; |
| 51 | + | DELIMITER ; |
| 52 | - | |
| 52 | + | |
| 53 | - | SET SQL_SAFE_UPDATES = 0; |
| 53 | + | SET SQL_SAFE_UPDATES = 0; |
| 54 | - | |
| 54 | + | |
| 55 | - | # все веса, которые могут получиться из входных весов |
| 55 | + | # все веса, которые могут получиться из входных весов |
| 56 | - | drop temporary table if exists h; |
| 56 | + | drop temporary table if exists h; |
| 57 | - | create temporary table h ( i INT NOT NULL ); |
| 57 | + | create temporary table h ( i INT NOT NULL ); |
| 58 | - | |
| 58 | + | |
| 59 | - | # веса, получаемые добавлением и вычитанием нового элемента |
| 59 | + | # веса, получаемые добавлением и вычитанием нового элемента |
| 60 | - | # из каждого элемента текущего набора. |
| 60 | + | # из каждого элемента текущего набора. |
| 61 | - | drop temporary table if exists g; |
| 61 | + | drop temporary table if exists g; |
| 62 | - | create temporary table g ( i INT NOT NULL ); |
| 62 | + | create temporary table g ( i INT NOT NULL ); |
| 63 | - | |
| 63 | + | |
| 64 | - | select can_calc_weight(12), can_calc_weight(10); |
| 64 | + | select can_calc_weight(12), can_calc_weight(10); |
| 65 | - | |
| 65 | + | |
| 66 | - | drop temporary table g; |
| 66 | + | drop temporary table g; |
| 67 | drop temporary table h; |