Stamps(多重带总数限制)
Stamps Given a set of N stamp values (e.g., {1 cent, 3 cents}) and an upper limit K to the number of stamps that can fit on an envelope, calculate the largest unbroken list of postages from 1 cent to M cents that can be created.
For example, consider stamps whose values are limited to 1 cent and 3 cents; you can use at most 5 stamps. It’s easy to see how to assemble postage of 1 through 5 cents (just use that many 1 cent stamps), and successive values aren’t much harder:
6 = 3 + 3
7 = 3 + 3 + 1
8 = 3 + 3 + 1 + 1
9 = 3 + 3 + 3
10 = 3 + 3 + 3 + 1
11 = 3 + 3 + 3 + 1 + 1
12 = 3 + 3 + 3 + 3
13 = 3 + 3 + 3 + 3 + 1.
However, there is no way to make 14 cents of postage with 5 or fewer stamps of value 1 and 3 cents. Thus, for this set of two stamp values and a limit of K=5, the answer is M=13.
The most difficult test case for this problem has a time limit of 3 seconds.
PROGRAM NAME: stamps
INPUT FORMAT
Line 1:
Two integers K and N. K (1 <= K <= 200) is the total number of stamps that can be used. N (1 <= N <= 50) is the number of stamp values.
Lines 2..end:
N integers, 15 per line, listing all of the N stamp values, each of which will be at most 10000.
SAMPLE INPUT (file stamps.in)
5 2
1 3
OUTPUT FORMAT
Line 1:
One integer, the number of contiguous postage values starting at 1 cent that can be formed using no more than K stamps from the set.
SAMPLE OUTPUT (file stamps.out)
13
分析
初始化都是最大数,f0=0。loop先V 后分组的value
class Stamps:
def getMaxAmount(self,K,N,values):
maxValue = max(values)*K
f = [maxValue+1]*(maxValue+1)
f[0] = 0
for j in range(1,maxValue + 1):
for v in values:
if j>=v:
f[j] = min(f[j],f[j-v] + 1)
if f[j] > K:
return j-1
return maxValue
obj = Stamps()
ret = obj.getMaxAmount(5,2,[1,3])
print(ret)
Last updated
Was this helpful?