SwVitaliy

Untitled

Jul 22nd, 2012
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 1.97 KB | None | 0 0
  1. #
  2. # Имеется груз массой massa и набор весов, указанных в таблице
  3. #
  4. #     CREATE TABLE m ( n INT UNSIGNED NOT NULL AUTO_INCREMENT, VALUE INT NOT NULL, PRIMARY KEY(n) );
  5. #    
  6. # где n - порядковый номер веса (без разрывов),
  7. #     VALUE - вес
  8. #
  9. # Можно ли указанными в таблице весами взвесить груз массой massa?
  10. #
  11. #     see http://www.youtube.com/watch?v=O97NBMlXAvc
  12. #
  13.  
  14. DELIMITER $$
  15.  
  16. DROP FUNCTION IF EXISTS can_calc_weight$$
  17. CREATE FUNCTION can_calc_weight (massa INT UNSIGNED)
  18.   RETURNS INT UNSIGNED
  19. BEGIN
  20.   DECLARE k INT UNSIGNED;
  21.   DECLARE max_k INT UNSIGNED;
  22.   DECLARE RESULT INT UNSIGNED;
  23.  
  24.   INSERT INTO h VALUES (0);
  25.  
  26.   SET max_k = (SELECT MAX(n) FROM m);
  27.   SET k = 1;
  28.  
  29.   while k <= max_k do
  30.       INSERT INTO g SELECT DISTINCT h.i + t.VALUE
  31.                         FROM    h,
  32.                             (   SELECT m.VALUE
  33.                                 FROM m
  34.                                 WHERE n=k
  35.                             UNION
  36.                                 SELECT -m.VALUE
  37.                                 FROM m
  38.                                 WHERE n=k ) AS t;
  39.      
  40.      
  41.       INSERT IGNORE INTO h SELECT * FROM g;
  42.       DELETE FROM g;
  43.       SET k = k + 1;
  44.   END while;
  45.  
  46.   SET RESULT = IF(massa IN (SELECT h.i FROM h WHERE h.i>0), 1, 0);
  47.   DELETE FROM h;
  48.   RETURN RESULT;
  49. END$$
  50.  
  51. DELIMITER ;
  52.  
  53. SET SQL_SAFE_UPDATES = 0;
  54.  
  55. # все веса, которые могут получиться из входных весов
  56. DROP TEMPORARY TABLE IF EXISTS h;
  57. CREATE TEMPORARY TABLE h ( i INT NOT NULL );
  58.  
  59. # веса, получаемые добавлением и вычитанием нового элемента
  60. # из каждого элемента текущего набора.
  61. DROP TEMPORARY TABLE IF EXISTS g;
  62. CREATE TEMPORARY TABLE g ( i INT NOT NULL );
  63.  
  64. SELECT can_calc_weight(12), can_calc_weight(10);
  65.  
  66. DROP TEMPORARY TABLE g;
  67. DROP TEMPORARY TABLE h;
Advertisement
Add Comment
Please, Sign In to add comment