日常刷題 郵票面值設計(搜尋與動態規劃)

2021-08-29 07:30:39 字數 1400 閱讀 4936

對於這一道題目,我們可以採取搜尋的手段去列舉每一張郵票,再用動態規劃求得最大的連續數值。其中的難點就是如何進行列舉,至於動態規劃則僅僅是完全揹包的乙個簡單變形。

搜尋:讓我們最後輸出的總數中要求從小到大按照次序輸入,那麼我們從小到大列舉即可。我們可以知道,數字1是必須要去的,不然就無法列舉到了數字1;接著,我們就要去列舉了。我們使用遞迴的引數來記錄取的個數take,最大連續和max,總和sum。那麼新取的數的範圍就必然在temp[take]+1~max+1(temp記錄取的數字)之間,做區間是為了保證有序性,右區間則保證了不會超過max+1,不然就無法列舉到這個max+1這個值了。列舉完之後,我們就考慮如何得到這個連續值。

dp動態規劃:完全揹包的簡單變形。設f[i]為組成數字i的最小郵票數.f[j

]=mi

n(f[

j],f

[j−t

emp[

i]]+

1)

f[j]=min(f[j],f[j-temp[i]]+1)

f[j]=m

in(f

[j],

f[j−

temp

[i]]

+1)即數字為j的,取了數字temp[i]就在原來的基礎上面+1的情況。但是需要注意,列舉數字的最大範圍是sum×n,表示每一件物品都取上限n個。最後的取值最大連續的數字答案ans的表示式為:ans

=max

(i),

(f[1

]−f[

i]≤n

)ans=max(i),(f[1]-f[i]≤n)

ans=ma

x(i)

,(f[

1]−f

[i]≤

n)只要線性掃瞄這個答案區間即可。

code

#include

using

namespace std;

#define maxn 500

#define maxnn 2000

#define int register int

int n,k,ans=0;

int f[maxnn]

,temp[maxn]

,fin[maxn]

;inline

intread()

return s*w;

}intdp(

int n,

int sum)

void

dfs(

int take,

int max,

int sum)

return;}

int i;

for(i=temp[take]+1

;i<=max+1;

++i)

return;}

intmain()

郵票面值設計

演算法提高 郵票面值設計 時間限制 1.0s 記憶體限制 256.0mb 提交此題 錦囊1 錦囊2 問題描述 給定乙個信封,最多隻允許貼上n張郵票,計算在給定k n k 13 種郵票的情況下 假定所有的郵票數量都足夠 如何設計郵票的面值,能得到最大值max,使在1 max之間的每乙個郵資值都能得到。...

郵票面值設計

stamps 郵票問題 題目描述 已知乙個 n 枚郵票的面值集合 如,和乙個上限 k 表示信封上能夠貼 k 張郵票。計算從 1 到 m 的最大連續可貼出的郵資。例如,假設有 1 分和 3 分的郵票 你最多可以貼 5 張郵票。很容易貼出 1 到 5 分的郵資 用 1 分郵票貼就行了 接下來的郵資也不難...

郵票面值設計

題目描述 給定乙個信封,最多隻允許貼上nn張郵票,計算在給定kk n k 15 種郵票的情況下 假定所有的郵票數量都足夠 如何設計郵票的面值,能得到最大值max,使在1至max之間的每乙個郵資值都能得到。例如,n 3,k 2,如果面值分別為1分 4分,則在1分 6分之間的每乙個郵資值都能得到 當然還...