Codevs P1047 郵票面值設計

2021-07-06 03:10:37 字數 2060 閱讀 4431

給定乙個信封,最多隻允許貼上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分。

n和k每種郵票的面值,連續最大能到的面值數。資料保證答案唯一。

3 21 3

max=7

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 athen

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

dobegin

num[step]:=i;

ifstep

then

begin

dfs(step+1);

endelse 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

測試點#sta***.in 結果:ac 記憶體使用量: 256kb 時間使用量: 3ms

測試點#stamp4.in 結果:ac 記憶體使用量: 168kb 時間使用量: 631ms

wikioi 1047 郵票面值設計

同樣感觸很深的一道題,之前打表,後來自己寫了一遍 具體就是用深搜找方案,用dp判斷 一道很經典的dfs套dp,但是程式很多地方還需優化 void dfs int num,int tk,int m 當前數值,種數,估計能構成的最大值 maxn cnt return for int i check m,...

codevs 1047郵票面值設計

codevs 1047郵票面值設計 剛看這題的時候就感覺是搜尋,但是分類又是動態規劃,就往動態規劃那裡想,結果就以為是那種乙個遞推式就出來的乙個動態規劃,後來寫 交上去發現都是錯了,才感覺這裡面肯定不是那麼簡單,是暗藏玄機的,每種郵票的面值不知道該如何確定,我找這個規律找了很久也沒有頭緒,就去看了題...

codevs1047 郵票面值設計

這個題乙個揹包dp,想的時候思維定勢,覺得乙個狀態轉移方程解決所有事。tan90,看來我還是太年輕。這個題可以用乙個搜尋先列舉出所有的郵票面額,然後進行dp,最後取個最大值 注意陣列不能開太大,否則初始化會炸 tle include include include using namespace s...