View difference between Paste ID: 2kDxDbgj and p1eHfYuV
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;