跳转详细版
如下图所示,我的思路:
- 当财产小于债权之和一半时,从最低层级债权开始逐层满足;
- 当财产 大于等于 债权一半时,从债权最高者到最低者逐层分配;
- 当财产大于债权之和时(图片没给出这种情况),所有人均分额外财产。
python代码(思路有了,代码很简单)
- 当财产不足所有人债权之和一半时
if money<sum_rights/2:
l3=[]
for i in range(n):
if money>l2[i]*(n-i):
for j in range(i,n):
l3[j]=l2[i]
money-=( l2[i]*(n-i) )
else:
for j in range(i,n):
l3[j]+=money/(n-i)
print('分配列表',l3)
break
- 当超过一半时
elif (sum_rights/2)<=money<sum_rights:
l3=l2
money-=(sum_rights/2)
for i in range(1,n):
if money>(l2[n-i] - l2[n-i-1])*i:
for j in range(n-i,n):
l3[j]+=(l2[n-i] - l2[n-i-1])
money-=(l2[n-i] - l2[n-i-1])*i
else:
for j in range(n-i,n):
l3[j]+=money/i
print('分配列表',l3)
money=0
break
if money!=0:#前面的循环是1~n-1层,最后一层单独在此分配
l3=[i+money/n for i in l3]
print('分配列表',l3)
- 当超过债权之和时
else:
each_add=(money-sum_rights)/n
l3=[i+each_add for i in l]
print('分配列表',l3)
完整代码,循环实现
#输入:财产、人数、债权
money=float(input('财产(float):'))
n=int(input('人数:'))
l=[]
for i in range(1,n+1):
l.append(int(input("债权%d (int):"%i)))
l.sort()#债权从小到大排序
print('债权列表',l)
sum_rights=sum(l)
l2=[i/2 for i in l]#债权一半
#当财产小于债权之和一半时
if money<sum_rights/2:
print()
l3=[]
for i in range(n):
if money>l2[i]*(n-i):
for j in range(i,n):
l3[j]=l2[i]
money-=( l2[i]*(n-i) )
else:
for j in range(i,n):
l3[j]+=money/(n-i)
print('分配列表',l3)
break
#当财产 大于等于 债权一半时
elif (sum_rights/2)<=money<sum_rights:
l3=l2
money-=(sum_rights/2)
for i in range(1,n):
if money>(l2[n-i] - l2[n-i-1])*i:
for j in range(n-i,n):
l3[j]+=(l2[n-i] - l2[n-i-1])
money-=(l2[n-i] - l2[n-i-1])*i
else:
for j in range(n-i,n):
l3[j]+=money/i
print('分配列表',l3)
money=0
break
if money!=0:#前面的循环是1~n-1层,最后一层单独在此分配
l3=[i+money/n for i in l3]
print('分配列表',l3)
#当财产大于债权之和时
else:
each_add=(money-sum_rights)/n
l3=[i+each_add for i in l]
print('分配列表',l3)