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