Помогите, как взять след, элемент списка?
Имеются 10 гирь весом 100, 200, 300, 500, 1000, 1200. 1400, 1500, 2000 и 3000 г. Сколькими способами гирями этого набора можно составить вес в v грамм. Набор гирь 1, то есть нельзя брать 2 раза по одной и той же гири.
weights=[100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000, 3000]
v=int(input("Введите желыемый вес до 10900 гр: "))
s=0
for i in range(10):
a=weights[i]
for k in range(10):
b=weights[k]
for l in range(10):
c=weights[l]
for q in range(10):
d=weights[q]
for w in range(10):
n=weights[w]
for e in range(10):
f=weights[e]
for r in range(10):
g=weights[r]
for t in range(10):
h=weights[t]
for y in range(10):
j=weights[y]
for u in range(10):
o=weights[u]
if (a+b==v or a+b+c==v or a+b+c+d==v or a+b+c+d+n==v or a+b+c+d+n+f==v or a+b+c+d+n+f+g==v or a+b+c+d+n+f+g+h==v or a+b+c+d+n+f+g+h+j==v or a+b+c+d+n+f+g+h+j+0==v):
s+=1
print(s)
Подскажите, как сделать так, чтобы он брал след. элемент? Потому что в данном виде он выдает ошибку, что такого индекса не существует. Также после его запуска он не выводит ответ.
Как найти количество комбинаций данного набора я понял и написал. Но как вот эту махину переделать во что-то читабельное? Все надо сделать с использованием циклов for.
Сама задача: Имеются 10 гирь весом 100, 200, 300, 500, 1000, 1200. 1400, 1500, 2000 и 3000 г. Сколькими способами гирями этого набора можно составить вес в v грамм
weights=[100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000, 3000]
v=int(input('Input weight:'))
s=0
if weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
if a+b==v:
if a==b: continue
s+=1
elif weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
if a+b+c==v:
if a==b==c or a==b or a==c: continue
s+=1
elif weights[6]+weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
for j in range(len(weights)):
d=weights[j]
if a+b+c+d==v:
if a==b==c or a==b or a==c or a==b==c==d or c==b or c==d or a==d or b==d: continue
s+=1
elif weights[5]+weights[6]+weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
for j in range(len(weights)):
d=weights[j]
for h in range(len(weights)):
e=weights[h]
if a+b+c+d+e==v:
if (a==b==c or a==b or a==c or a==b==c==d or c==b or c==d or a==d
or b==d or a==b==c==d==e or a==e or b==e or c==e or d==e): continue
s+=1
elif weights[4]+weights[5]+weights[6]+weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
for j in range(len(weights)):
d=weights[j]
for h in range(len(weights)):
e=weights[h]
for x in range(len(weights)):
f=weights[x]
if a+b+c+d+e+f==v:
if (a==b==c or a==b or a==c or a==b==c==d or c==b or c==d or a==d
or b==d or a==b==c==d==e or a==e or b==e or c==e or d==e or a==b==c==d==e==f or a==f or b==f or c==f or d==f or e==f): continue
s+=1
elif weights[3]+weights[4]+weights[5]+weights[6]+weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
for j in range(len(weights)):
d=weights[j]
for h in range(len(weights)):
e=weights[h]
for x in range(len(weights)):
f=weights[x]
for z in range(len(weights)):
g=weights[z]
if a+b+c+d+e+f+g==v:
if (a==b==c or a==b or a==c or a==b==c==d or c==b or c==d or a==d
or b==d or a==b==c==d==e or a==e or b==e or c==e or d==e
or a==b==c==d==e==f or a==f or b==f or c==f or d==f or e==f
or a==b==c==d==e==f==g or a==g or b==g or c==g or d==g or e==g or d==g): continue
s+=1
elif weights[2]+weights[3]+weights[4]+weights[5]+weights[6]+weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
for j in range(len(weights)):
d=weights[j]
for h in range(len(weights)):
e=weights[h]
for x in range(len(weights)):
f=weights[x]
for z in range(len(weights)):
g=weights[z]
for m in range(len(weights)):
u=weights[m]
if a+b+c+d+e+f+g+u==v:
if (a==b==c or a==b or a==c or a==b==c==d or c==b or c==d or a==d
or b==d or a==b==c==d==e or a==e or b==e or c==e or d==e
or a==b==c==d==e==f or a==f or b==f or c==f or d==f or e==f
or a==b==c==d==e==f==g or a==g or b==g or c==g or d==g or
e==g or d==g or a==b==c==d==e==f==g==m or a==m or b==m or
c==m or d==m or e==m or f==m or g==m): continue
s+=1
elif weights[1]+weights[2]+weights[3]+weights[4]+weights[5]+weights[6]+weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
for j in range(len(weights)):
d=weights[j]
for h in range(len(weights)):
e=weights[h]
for x in range(len(weights)):
f=weights[x]
for z in range(len(weights)):
g=weights[z]
for m in range(len(weights)):
u=weights[m]
for r in range(len(weights)):
p=weights[r]
if a+b+c+d+e+f+g+u+p==v:
if (a==b==c or a==b or a==c or a==b==c==d or c==b or c==d or a==d
or b==d or a==b==c==d==e or a==e or b==e or c==e or d==e
or a==b==c==d==e==f or a==f or b==f or c==f or d==f or e==f
or a==b==c==d==e==f==g or a==g or b==g or c==g or d==g or
e==g or d==g or a==b==c==d==e==f==g==m or a==m or b==m or
c==m or d==m or e==m or f==m or g==m or a==b==c==d==e==f==g==m
or a==r or b==r or c==r or d==r or e==r or f==r or g==r or m==r ): continue
s+=1
elif weights[0]+weights[1]+weights[2]+weights[3]+weights[4]+weights[5]+weights[6]+weights[7]+weights[8]+weights[9]>=v:
for i in range(len(weights)):
a=weights[i]
for k in range(len(weights)):
b=weights[k]
for l in range(len(weights)):
c=weights[l]
for j in range(len(weights)):
d=weights[j]
for h in range(len(weights)):
e=weights[h]
for x in range(len(weights)):
f=weights[x]
for z in range(len(weights)):
g=weights[z]
for m in range(len(weights)):
u=weights[m]
for r in range(len(weights)):
p=weights[r]
for q in range(len(weights)):
w=weights[q]
if a+b+c+d+e+f+g+u+p==v:
if (a==b==c or a==b or a==c or a==b==c==d or c==b or c==d or a==d
or b==d or a==b==c==d==e or a==e or b==e or c==e or d==e
or a==b==c==d==e==f or a==f or b==f or c==f or d==f or e==f
or a==b==c==d==e==f==g or a==g or b==g or c==g or d==g or
e==g or d==g or a==b==c==d==e==f==g==m or a==m or b==m or
c==m or d==m or e==m or f==m or g==m or a==b==c==d==e==f==g==m==r
or a==r or b==r or c==r or d==r or e==r or f==r or g==r or m==r
or a==b==c==d==e==f==g==m==r==w or a==w or b==w or c==w or d==w
or e==w or f==w or g==w or m==w or r==w ): continue
s+=1
print(s//2)
Ответы (2 шт):
задачу можно решить рекурсией
def rec_weight(x, y, k=0):
if x > y:
k += 1
k, p = rec_weight(x - y, y, k)
else:
p = x
return k, p
def rec_filling(s, yy, m=[]):
if yy[0] <= s:
for y in reversed(yy):
if s >= yy[0] and s >= y:
if y == s:
m.append(y)
break
else:
m.append(y)
new_s = s - y
rec_filling(new_s, yy, m)
break
return m
def near_weight(x, xx):
max_part, rest_part = rec_weight(x, xx[-1])
res_result = rec_filling(rest_part, xx, [])
print([xx[-1] for a in range(max_part)] + res_result)
weights = [100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000, 3000]
for v in [99, 999, 1900, 2600, 4500, 9999]:
near_weight(v, weights)
# []
# [500, 300, 100]
# [1500, 300, 100]
# [2000, 500, 100]
# [3000, 1500]
# [3000, 3000, 3000, 500, 300, 100]
from itertools import combinations
weights=[100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000, 3000]
v = 1900 # example v
ans = 0
for n_comb in range(1, len(weights) + 1):
for comb in combinations(weights, r=n_comb):
if sum(comb) == v:
ans += 1
print(ans) # 5
Однострочная реализация:
from itertools import combinations
weights=[100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000, 3000]
v = 1900 # example v
print(sum(1 for n_comb in range(1, len(weights) + 1)
for comb in combinations(weights, r=n_comb) if sum(comb) == v)) # 5