E-MELON的难题-200分

刷题笔记合集🔗

题目描述

MELON有一堆精美的雨花石(数量为n,重量各异),准备送给S和W。MELON希望送给两人的雨花石重量一致,请设计一个程序,帮MELON确认是否能将雨花石平均分配。

输入格式

第1行输入为雨花石个数n,其中0 < n < 31。 第2行输入为空格分割的各雨花石重量:m[0] m[1] ... m[n-1],其中0 < m[k] < 1001。

不需要考虑异常输入的情况。

输出格式

如果可以均分,输出从当前雨花石中最少需要拿出几块,可以使两堆的重量相等; 如果不能均分,则输出-1。

约束说明

  • 1 ≤ n ≤ 30
  • 1 ≤ m[k] ≤ 1000

样例输入1

4
1 1 2 2

样例输出1

2

样例说明1

输入第一行代表共4颗雨花石,第二行代表4颗雨花石重量分别为1、1、2、2。 均分时只能分别为1,2,需要拿出重量为1和2的两块雨花石,所以输出2。

样例输入2

10
1 1 1 1 1 9 8 3 7 10

样例输出2

3

样例说明2

输入第一行代表共10颗雨花石,第二行代表雨花石重量。 均分方案有多种:

  1. 1,1,1,1,1,9,7和10,8,3 (拿出3块)
  2. 1,1,1,1,9,8和10,7,3,1 (拿出4块)
  3. ...其他均分方式 第一种方案只需要拿出重量为10,8,3的3块雨花石,是最少的,所以输出3。

题目解析

本题是一个变种的01背包问题。关键点:

  1. 问题分析

    • 首先判断总重量是否能被2整除
    • 如果可以整除,则尝试找到最少数量的石头组成一半重量
    • 如果找不到这样的组合,说明无法平分
  2. 动态规划实现

    • dp[i][j]表示从前i个石头中选择,能装满重量j的最少石头数
    • 状态转移:dp[i][j] = min(dp[i-1][j], dp[i-1][j-w] + 1)
    • 初始化:dp[0][0]=0, dp[0][j]=n(j>0)
  3. 求解步骤

    • 计算总重量sum
    • 如果sum为奇数,返回-1
    • 否则目标重量为sum/2
    • 使用dp求解最少需要的石头数

时间复杂度: O(n*sum),其中n是石头数量,sum是总重量

参考代码

def solve():
    # 读取输入
    n = int(input())
    stones = list(map(int, input().split()))
    
    # 计算总重量
    total = sum(stones)
    if total % 2 != 0:
        return -1
        
    target = total // 2
    
    # dp[i][j]表示从前i个石头中选择,能装满重量j的最少石头数
    dp = [[n+1] * (target + 1) for _ in range(n + 1)]
    dp[0][0] = 0
    
    # 动态规划
    for i in range(1, n + 1):
        w = stones[i-1]
        for j in range(target + 1):
            if j < w:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = min(dp[i-1][j], dp[i-1][j-w] + 1)
    
    # 如果无法达到目标重量
    if dp[n][target] == n+1:
        return -1
        
    return dp[n][target]

if __name__ == "__main__":
    print(solve())
#include 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

繁华的街道两旁,湿漉漉的下午,两个青涩的脸庞互相张望。宽大卫衣下娇小的她,向我奔来。不约而同的卫衣,斯文的半框眼镜掩饰着一个穷臭屌丝气息。这是我和我牛爱网第一死忠粉兼专属女嘉宾最初的见面。火速恋爱,但是没有所谓的快节奏,相识半年,还是一样的热恋。吃着肉夹馍坐过西安的小三轮洱海边自行车的气球胖吃着她最喜欢的酸酸水果和小乳扇在南山某店爷爷穿孙子衣服,摸肥猫就算我在忙也要抽出时间陪她去吃他喜欢的漂亮饭生活总是平凡,但平凡不平淡还记得见面第一件事儿:“我去上个厕所。”现在早上第一件事儿:“拉*”第一次上我车的她:“我可以坐副驾吗?”现在的她:“老子把jio翘到上面得得挡到你后视镜。”这小孩,虽然花了我...
Stan_蹒跚者:确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
03-28 13:48
hory权:校招vip纯神人了,还说自己是什么师范大学的
点赞 评论 收藏
分享
05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务