硬币找钱问题(change)

program money;

const
 maxn=20000;
 value:array [1..6] of longint=(1,2,4,10,20,40);

var
 dp,change:array [0..maxn] of longint;
 number:array [1..6] of longint;
 m:real;
 ans,n:longint;

procedure backup;
var
 i,j,k,bigger,temp,need:longint;
begin
 fillchar(dp,sizeof(dp),255);
 dp[0]:=0;
 bigger:=0;
 for i:=1 to 6 do
  begin
   for k:=1 to number[i] do
    begin
     inc(bigger,value[i]);
     for j:=bigger downto value[i] do
      begin
       if dp[j-value[i]]<>-1 then
        begin
         temp:=dp[j-value[i]]+1;
         if (dp[j]=-1) or (temp<dp[j]) then dp[j]:=temp;
        end;
      end;
    end;
  end;

 ans:=-1;
 for i:=n to bigger do
  begin
   if dp[i]<>-1 then
    begin
     need:=i-n;
     if change[need]<>-1 then
      begin
       temp:=dp[i]+change[need];
       if (ans=-1) or (ans>temp) then ans:=temp;
      end;
    end;
  end;
 if ans<>-1 then writeln(ans) else writeln('impossible');
end;

procedure init;
var
 i,j,t,tt:longint;
begin
 fillchar(change,sizeof(change),255);
 change[0]:=0;
 for i:=1 to 6 do
  begin
   for j:=value[i] to maxn do
    begin
     if change[j-value[i]]<>-1 then
      begin
       t:=change[j-value[i]]+1;
       if (change[j]=-1) or (t<change[j]) then change[j]:=t;
      end;
    end;
  end;

 read(number[1],number[2],number[3],number[4],number[5],number[6]);
 while number[1]+number[2]+number[3]+number[4]+number[5]+number[6]<>0 do
  begin
   tt:=0;
   readln(m);
   n:=round(m*100);
   if n mod 5<>0 then
    begin
     writeln('impossible');
     tt:=1;
    end
   else n:=n div 5;
   if tt=0 then backup;
   read(number[1],number[2],number[3],number[4],number[5],number[6]);
  end;
end;

begin
 assign(input,'money.in'); reset(input);
 assign(output,'money.out'); rewrite(output);

 init;

 close(input); close(output);
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值