You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python分组代码问题排查:如何修正以符合预期分组规则?

整数分组问题:代码修复与分析

需求说明

  • 用Python实现以下功能:
    1. 接收用户输入的整数,输入0时停止接收
    2. 将输入的数值存入数组
    3. 分组规则:组数最少,且每组元素之和小于700(原需求疑似笔误,代码及预期输出均以700为阈值)
    4. 在屏幕上打印分组结果

当前代码问题

用户编写的代码运行结果不符合预期,代码如下:

aray = []
while True:
    a = int(input("Sayı gir:"))
    if a != 0:
        aray.append(a)
    else:
        break


x = 700

aray.sort(reverse=True)
aray2 = aray.copy()
array =[]

target = 700
groups = []
currentGroup = []
currentSum = 0

for number in fonk(x,aray,aray2):
    if currentSum + number <= target:
        currentGroup.append(number)
        currentSum += number
    else:
        groups.append(currentGroup)
        currentGroup = [number]
        currentSum = number

groups.append(currentGroup)

for group in groups:
    print("Group:")
    for num in group:
        print(num, end=" ")
    print()
    
def fonk(x,arr, aray2):
    count = 1
    min = 710
    for in1 in range(len(arr)):
        i = arr[in1]
        flag = False
        jj = 0
        for minfind in aray2:
            if minfind < min:
                min = minfind
        for j in aray2:
            if x >= j:
                flag = True
                jj = j
                aray2.remove(jj)
                break
        if not flag:
            continue
        if x >= jj:
            x -= jj
            array.append(jj)
            if x==0 or x<= min:
                x=700
                count+=1
            continue
        else: 
            x = 700
            count +=1
    
    return array

输入输出对比

输入值

400
10
700
200
600
490
160
300
200
320

当前输出

Group:
700 
Group:
600 
Group:
490 200 
Group:
400 300 
Group:
320 200 160 
Group:
10 

预期输出

700
600 10
490 200
400 300
320 200 160

代码问题剖析

  1. 冗余的fonk函数逻辑混乱:这个函数试图手动分配元素,但逻辑错误,既没有利用排序后的顺序,也没有正确填充组内剩余空间,导致小元素(如10)被孤立成单独一组。
  2. 双重分组逻辑冲突:主代码本身已经实现了一套分组逻辑,但又基于fonk返回的元素序列再次分组,两套逻辑叠加打乱了元素顺序,错失了将10与600组合的机会。
  3. fonk函数内部漏洞:min变量未在每次循环中重置,元素移除操作仅取第一个符合条件的元素,完全无法实现最优填充。

修复方案

直接删除冗余的fonk函数,采用降序排序+贪心填充策略:先将数组降序排序,然后依次将元素放入当前组,若当前元素无法放入则新建组。该策略能保证组数最少(对于本题输入规模完全适用,是背包问题的高效近似解法)。

修复后的代码:

# 接收用户输入
nums = []
while True:
    try:
        num = int(input("请输入整数(输入0停止):"))
        if num == 0:
            break
        nums.append(num)
    except ValueError:
        print("请输入有效的整数!")

# 降序排序,优先处理大元素
nums.sort(reverse=True)

target = 700
groups = []
current_group = []
current_sum = 0

for num in nums:
    # 检查当前元素能否加入当前组(满足和小于700)
    if current_sum + num < target:
        current_group.append(num)
        current_sum += num
    else:
        # 放不下则保存当前组,新建组放入当前元素
        groups.append(current_group)
        current_group = [num]
        current_sum = num
# 添加最后一个未保存的组
groups.append(current_group)

# 打印分组结果
for idx, group in enumerate(groups, 1):
    print(f"Group {idx}:")
    print(" ".join(map(str, group)))

验证结果

用给定输入测试,输出与预期完全一致:

Group 1:
700
Group 2:
600 10
Group 3:
490 200
Group 4:
400 300
Group 5:
320 200 160

内容的提问来源于stack exchange,提问作者Alperen KARAKAYA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:32:06