none
Помогите пожалуйста, всю голову уже сломал((( RRS feed

  • Вопрос

  • Нужно на t-sql определить может ли продавец выдать сдачу из монет номиналом 1,2,5,10 руб, которые у него есть в наличии и если может то сколько монет какого номинала будет выдано. Чувствую что нужно копать или в сторону метода перебора или в рекурсию. Помогите пожауйста.
    30 ноября 2015 г. 15:07

Ответы

  • Примерно так, все условия не проверял, академически вроде достаточно работоспособное. В @Summ - сумма сдачи
    if object_id('tempdb..#cash') is not null 
    drop table #cash
    create table #cash
    (
    		[Nominal] decimal(18,2),
    		[Count] int
    )
    
    if object_id('tempdb..#taller') is not null 
    drop table #taller
    create table #taller
    (
    		[Nominal] decimal(18,2),
    		[Count] int
    )
    
    insert into #taller ([Nominal],[Count]) values (1,10)
    insert into #taller ([Nominal],[Count]) values (2,10)
    insert into #taller ([Nominal],[Count]) values (3,10)
    insert into #taller ([Nominal],[Count]) values (10,10)
    insert into #taller ([Nominal],[Count]) values (5,10)
    
    --select * from #taller
    
    declare @Summ decimal(18,2)
    
    set @Summ=110
    
    	declare @min_nominal decimal(18,2),@rest decimal(18,2),@max_nominal decimal(18,2),@cou_max int
    	set @rest=@Summ
    	while(1=1) begin
    			
    		select @max_nominal=max(nominal) from #taller where [COUNT]>0 and Nominal<=@rest 
    		if(@max_nominal is not null) begin
    			select @cou_max=(select [COUNT] from #taller where Nominal=@max_nominal)
    			
    			declare @max_mon int
    			set @max_mon=FLOOR(@rest/@max_nominal)
    			if(@max_mon>@cou_max) begin
    				set @max_mon=@cou_max;
    			end
    						
    			set @rest=@rest-(@max_mon*@max_nominal)
    			insert into #cash ([Nominal],[Count]) values (@max_nominal,@max_mon)
    			update n set n.[Count]=n.[Count]-@max_mon from #taller n where n.nominal=@max_nominal
    			
    			if(@rest=0)begin
    				break;
    			end		
    		end else begin
    			raiserror('Нет размена',18,1);
    			return;
    		end
    		--break;
    	end
    	
    	select * from #cash

    1 декабря 2015 г. 5:53

Все ответы

  • Комбинаторика, Т-СКЛ - не самый лучший инструмент для решения подобных задач

    http://www.t-sql.ru

    30 ноября 2015 г. 15:43
    Отвечающий
  • У вас это реальная задача или учебная? Если реальная, то читайте про backtracking и пишите на чём-нибудь более приспособленном к вычислительным задачам, чем T-SQL

    30 ноября 2015 г. 16:57
  • Учебная, причем главное условие - выполнение на T-SQL
    30 ноября 2015 г. 16:59
  • Примерно так, все условия не проверял, академически вроде достаточно работоспособное. В @Summ - сумма сдачи
    if object_id('tempdb..#cash') is not null 
    drop table #cash
    create table #cash
    (
    		[Nominal] decimal(18,2),
    		[Count] int
    )
    
    if object_id('tempdb..#taller') is not null 
    drop table #taller
    create table #taller
    (
    		[Nominal] decimal(18,2),
    		[Count] int
    )
    
    insert into #taller ([Nominal],[Count]) values (1,10)
    insert into #taller ([Nominal],[Count]) values (2,10)
    insert into #taller ([Nominal],[Count]) values (3,10)
    insert into #taller ([Nominal],[Count]) values (10,10)
    insert into #taller ([Nominal],[Count]) values (5,10)
    
    --select * from #taller
    
    declare @Summ decimal(18,2)
    
    set @Summ=110
    
    	declare @min_nominal decimal(18,2),@rest decimal(18,2),@max_nominal decimal(18,2),@cou_max int
    	set @rest=@Summ
    	while(1=1) begin
    			
    		select @max_nominal=max(nominal) from #taller where [COUNT]>0 and Nominal<=@rest 
    		if(@max_nominal is not null) begin
    			select @cou_max=(select [COUNT] from #taller where Nominal=@max_nominal)
    			
    			declare @max_mon int
    			set @max_mon=FLOOR(@rest/@max_nominal)
    			if(@max_mon>@cou_max) begin
    				set @max_mon=@cou_max;
    			end
    						
    			set @rest=@rest-(@max_mon*@max_nominal)
    			insert into #cash ([Nominal],[Count]) values (@max_nominal,@max_mon)
    			update n set n.[Count]=n.[Count]-@max_mon from #taller n where n.nominal=@max_nominal
    			
    			if(@rest=0)begin
    				break;
    			end		
    		end else begin
    			raiserror('Нет размена',18,1);
    			return;
    		end
    		--break;
    	end
    	
    	select * from #cash

    1 декабря 2015 г. 5:53