時空限制 1000ms/128mb
給定乙個信封,最多隻允許貼上n(n<=100)張郵票,我們現在有m(m<=100)種郵票,面值分別為:x1,x2,…….xm分(xi<=255,為正整數),並假設各種郵票都有足夠多張.
要求計算所能獲得的郵資最大範圍,即求最大值max,使在1—max之間的每乙個郵資值都能得到.
例如:n=4,有2種郵票,面值分別為1分,4分,於是可以得到1----10分,和12分,13分,16分的郵資,由於不能得到11分和15分,所有郵資的最大範圍是max=10.
從鍵盤輸入乙個文字檔案的檔名
,該檔案第
1行為最多貼上的郵票數n;第
2行為郵票種數
m,以下
m行各有乙個數字
,表示郵票的面值
xi.1. 若最大範圍為空,則在螢幕上輸出max=0
2. 若最大範圍不為空,則把結果輸出到螢幕上.
4214
max=10
本題可以看成是乙個集合問題
,即求在貼的郵票不多於
n張的可滿足條件的郵資集。
集合問題的關鍵在於判定元素是否在集合中,
對於本題而言
,是判斷某個郵資是否在貼不多於
n張郵票可滿足。
這個判斷問題可以用遞迴的方法解決
。設當前考慮的郵資值為
maxv,
最多允許貼
n張郵票,
記為(maxv,n).
如果首先貼一張面值為
xi的郵票,
那麼剩下的問題是
(maxv-xi,n-1)
的問題。
如果(maxv-xi,n-1)
可解,那麼
(maxv,n)
問題也可解
。進一步
, 這個遞迴的演算法可以轉化為遞推的演算法來解決。
設f[value]
表示郵資為
value
時所需最少的郵票數,
f[maxv]=min。
當f[value]<=n
時,問題
(maxv,n)
可解,否則無解。
遞推演算法可以描述為
:
for (int i=1; i<=m; i++)
if (maxv>=x[i])
以樣例資料為例:
value
f[value]00
1min=1
2min=2
3min=3
4min=1
5min=2
6min=3
7min=4
8min=2
9min=3
10min=4
11min=5(>4)
#includeusing namespace std;
const int m = 105, n = 25600;
int x[m],f[n]=; //f[i] 為面額為i所貼郵票最少張數
int main()
if (f[maxv]==0 || f[maxv]>n)
}}
Codeup 問題 A 裝箱問題
問題描述 有乙個箱子的容量為v v為正整數,且滿足0 v 20000 同時有n件物品 0的體積值為正整數。要求從n件物品中,選取若干裝入箱內,使箱子的剩餘空間最小。輸入 1行整數,第1個數表示箱子的容量,第2個數表示有n件物品,後面n個數分別表示這n件 物品各自的體積。輸出 1個整數,表示箱子剩餘空...
codeup 裝箱問題
時間限制 1 sec 記憶體限制 128 mb 獻花 105 解決 44 獻花 花圈 tk題庫 問題描述 有乙個箱子的容量為v v為正整數,且滿足0 v 20000 同時有n件物品 0的體積值為正整數。要求從n件物品中,選取若干裝入箱內,使箱子的剩餘空間最小。輸入 1行整數,第1個數表示箱子的容量,...
1045 郵票組合問題
description 某人有四張3分的郵票和三張5分的郵票,用這些郵票中的一張或若干張可以得到多少種不同的郵資?input output 可得到多少種 sample input sample output 19 hint 將問題進行數學分析,不同張數和面值的郵票組成的郵資可用下列公式計算 s 3 ...