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