Codevs P1047 郵票面值設計

Codevs P1047 郵票面值設計


題目描述 Description

給定一個信封,最多隻允許粘貼N張郵票,計算在給定K(N+K≤40)種郵票的情況下(假定所有的郵票數量都足夠),如何設計郵票的面值,能得到最大值MAX,使在1~MAX之間的每一個郵資值都能得到。
例如,N=3,K=2,如果面值分別爲1分、4分,則在1分~6分之間的每一個郵資值都能得到(當然還有8分、9分和12分);如果面值分別爲1分、3分,則在1分~7分之間的每一個郵資值都能得到。可以驗證當N=3,K=2時,7分就是可以得到的連續的郵資最大值,所以MAX=7,面值分別爲1分、3分。


輸入輸出


輸入描述 Input Description

N和K

輸出描述 Output Description

每種郵票的面值,連續最大能到的面值數。數據保證答案唯一。


樣例 Sample


樣例輸入 Sample Input

3 2


樣例輸出 Sample Output

1 3

MAX=7


數據範圍及提示 Data Size & Hint


代碼如下

program p1047;
var n,k,i,maxn:longint;
    num,ans:array[1..1000] of longint;
    f:array[0..1000] of longint;
function max(a,b:longint):longint;
var i:longint;
begin
 if a>b then exit(a);
 for i:=1 to k do
  ans[i]:=num[i];
 exit(b);
end;

function min(a,b:longint):longint;
begin
 if a<b then exit(a);
 exit(b);
end;

procedure dp;
var i,j:longint;
begin
 i:=0;
 f[0]:=0;
 repeat
  inc(i);
  f[i]:=maxlongint;
  for j:=1 to k do
   begin
    if i-num[j]>=0
     then
      begin
       f[i]:=min(f[i],f[i-num[j]]+1);
      end;
   end;
 until f[i]>n;
 maxn:=max(maxn,i-1);
end;

procedure dfs(step:longint);
var i:longint;
begin
 for i:=num[step-1]+1 to n*num[step-1]+1 do
  begin
   num[step]:=i;
   if step<k
    then
     begin
      dfs(step+1);
     end
    else dp;
  end;
end;

begin
 readln(n,k);
 num[1]:=1;
 maxn:=-maxlongint;
 dfs(2);
 for i:=1 to k do
  write(ans[i],' ');
 writeln;
 write('MAX=',maxn);
end.

評測結果

測試通過 Accepted

總耗時: 672 ms
0 / 0 數據通過測試.
運行結果
測試點#stamp1.in 結果:AC 內存使用量: 268kB 時間使用量: 1ms
測試點#stamp2.in 結果:AC 內存使用量: 128kB 時間使用量: 37ms
測試點#stamp3.in 結果:AC 內存使用量: 256kB 時間使用量: 3ms
測試點#stamp4.in 結果:AC 內存使用量: 168kB 時間使用量: 631ms

這裏寫圖片描述

這裏寫圖片描述
這裏寫圖片描述

發佈了76 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章