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