问题描述
每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的OIER想要研究一下物品不能装出的最大体积。题目保证有解,如果是有限解,保证不超过2,000,000,000
如果是无限解,则输出0
输入格式
第一行一个整数n(n<=10),表示物品的件数
第2行到N+1行: 每件物品的体积(1<= <=500)
输出格式
一个整数ans,表示不能用这些物品得到的最大体积。
样例输入
3
3
6
10
样例输出
17
思路:
此题的意思就是在物品中背包保证不超过2,000,000,000的容量的情况下找到不能用这些物品得到的最大体积。那我们就分为两种情况考虑:
如果所有的物品体积的最大公约数不为1,则为无限解(无限大)。
如果所有的物品体积的最大公约数为1,则从物品开始,找出最后一个不能组成的数。
我们知道如果最大公约数不为1的话,不能用这些物品得到的最大体积,因为这是无限大的数,但公约数为1的话可以找到最大值因为每件物品的体积小于等于500,所以200000便足够了。
那我们就先计算出所有的物品体积的最大公约数。
然后在用一个列表存储所有的物品体积对应可以存储的容量我们标记为1,用vla[i]对应i表示是否可以用以上物品装满可以为1.
并用k 来计录不能得到的最大体积。
def aa(a,b): #最大公约数
if a%b==0:
return b
return aa(b,a%b)
def Divisor(a,n): #所有物品的最大公约数
t=a[0]
for i in range(1,n):
t=aa(t,a[i])
if t==1: #是否最公约数为1
max(a,n)
else: #公约数不为1
print(0)
return
def max(a,n): #找出不能得到的最大体积
vla=[0 for i in range(200002)]
vla[0]=1 #初始化
k=0 #初始化
for i in range(n): #当前物品
for j in range(a[i],200001): #当前容量
if vla[j-a[i]]==1: #是否可以得到
vla[j]=1
else:
k=j-a[i] #储存不能得到的最大体积
print(k)
return
n=int(input())
Articles=[int(input())for i in range(n)] #存储物品
Divisor(Articles,n)