對於這一道題目,我們可以採取搜尋的手段去列舉每一張郵票,再用動態規劃求得最大的連續數值。其中的難點就是如何進行列舉,至於動態規劃則僅僅是完全揹包的乙個簡單變形。
搜尋:讓我們最後輸出的總數中要求從小到大按照次序輸入,那麼我們從小到大列舉即可。我們可以知道,數字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分之間的每乙個郵資值都能得到 當然還...